預先安裝的系統套件

Android 支援在單一裝置上使用多位使用者。詳情請參閱「支援多位使用者」。並非所有系統套件都適用於所有類型的 Android 使用者,因此您可以使用許可清單,指定應為每種類型的使用者預先安裝哪些系統套件。不預先安裝不必要的系統套件,即可改善使用者建立時間、啟動時間和記憶體用量。

使用以 frameworks/base/data/etc/preinstalled-packages-platform.xml 為範本的系統設定 XML 檔案,宣告應根據新使用者的使用者類型,為他們初始安裝哪些系統套件。在理想情況下,裝置上的所有系統套件都應在 XML 檔案中 (以資訊清單名稱做為索引) 設有項目,靜態覆疊層除外,因為系統會根據對應覆疊層目標套件的項目,自動處理靜態覆疊層。裝置應如何處理未列於此處的系統套件,取決於設定模式

使用者類型

基礎使用者類型 (每位使用者至少屬於其中一種) 如下:

使用者類型 說明
SYSTEM 使用者 0。
FULL 任何非個人資料的使用者。
PROFILE 個人資料中的使用者。

每個值的確切意義請參閱 frameworks/base/core/java/android/content/pm/UserInfo.java

您可以指定個別使用者類型,獲得更精細的控制權,因為每位使用者都屬於其中一種使用者類型,包括 frameworks/base/core/java/android/os/UserManager.java 中定義的 AOSP 使用者類型,以及 frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java. 中定義的任何 OEM 自訂使用者類型。詳情請參閱「使用者類型」頁面。目前 AOSP 使用者類型包括:

  • android.os.usertype.full.SYSTEM
  • android.os.usertype.full.SECONDARY
  • android.os.usertype.full.GUEST
  • android.os.usertype.full.DEMO
  • android.os.usertype.full.RESTRICTED
  • android.os.usertype.profile.MANAGED
  • android.os.usertype.profile.PRIVATE
  • android.os.usertype.system.HEADLESS

範例

以下範例說明最常見的用途:

  1. 如要在使用者 0 中預先安裝系統套件:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
  2. 如要讓系統套件預先安裝在所有使用者 (例如網路瀏覽器) 身上,也就是安裝在任何 FULLPROFILE 類型的使用者身上,以便處理所有使用者:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  3. 系統套件會預先安裝在所有使用者 (除了設定檔使用者) 的裝置上。例如,這可套用至桌布應用程式:
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
  4. 有些系統套件確實需要供所有使用者使用,不論使用者類型為何。在這種情況下,請使用:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
  5. 您也可以指定個別使用者類型,取得更精細的選項。舉例來說,以下程式碼範例會在任何使用者類型為受管理的個人資料或訪客,或是 SYSTEM 基本類型的使用者上安裝這個套件。
    <install-in-user-type package="com.android.example">
        <install-in user-type="android.os.usertype.profile.MANAGED" />
        <install-in user-type="android.os.usertype.full.GUEST" />
        <install-in user-type="SYSTEM">
    </install-in-user-type>

do-not-install-in 代碼

您也可以使用 do-not-install-in 代碼,防止特定使用者類型預先安裝套件。請注意,do-not-install-in 標記會覆寫任何檔案中的 install-in 標記。例如:

<install-in-user-type package="com.android.example">
    <install-in user-type="FULL" />
    <do-not-install-in user-type="android.os.usertype.full.GUEST"/>
</install-in-user-type>
如果使用者類型為 android.os.usertype.full.GUEST (FULL 的子類型),則系統不會安裝這個套件,因為 do-not-install-in 標記優先於 install-in

使用 config.xml 控制行為

設定資源值 config_userTypePackageWhitelistMode 會控制這項功能,並決定裝置如何解讀沒有任何使用者類型項目的系統套件。詳情請參閱 frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode

frameworks/base/core/res/res/values/config.xml 中,將名為 config_userTypePackageWhitelistMode 的整數設為下列值的組合。這些標記可以合併使用。最重要的標記如下:

說明
0 (0b0000) 停用:安裝所有系統套件。
1 (0b0001) 執行。僅在許可清單中安裝系統套件。
4 (0b0100) 將許可清單檔案中未提及的任何套件視為隱含許可清單。
8 (0b1000) 將許可清單檔案中未提及的任何套件視為僅針對系統使用者隱含許可清單。

下列設定可啟用這項功能 (因此會遵循 install-indo-not-install-in 標記),但會將未提及的任何系統套件視為所有使用者的 install-in

<integer name="config_userTypePackageWhitelistMode">5</integer>