预安装系统软件包

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.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) 将许可名单文件中未提及的任何系统软件包视为已隐式列入许可名单,但这仅限 SYSTEM 用户。

以下配置将启用此功能(以便遵循 install-indo-not-install-in 标记),但会将许可名单文件中未提及的任何系统软件包视为具有 install-in,这适用于所有用户:

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