預裝系統包

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使用者類型和任何OEM自訂使用者在frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java.有關詳細信息,請參閱使用者類型頁面。目前,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.system.HEADLESS

例子

以下範例解決了最常見的用例:

  1. 對於在使用者 0 中預先安裝的系統套件:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
    
  2. 對於要預先安裝在所有人類使用者(例如 Web 瀏覽器)上的系統軟體包,即安裝在類型為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標記會覆蓋任何檔案中的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)將允許清單檔案中未提及的任何套件視為僅針對 SYSTEM 使用者隱含列入允許清單。

以下配置將啟用此功能(以便遵守install-indo-not-install-in標籤),但會將任何未提及的系統軟體包視為為所有使用者install-in

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