Android 支持在单个设备上拥有多个用户。如需了解详情,请参阅支持多用户。由于并非所有系统软件包都对所有类型的 Android 用户都很有用,因此您可以使用允许列表来指定应在每种类型的用户上预安装哪些系统软件包。通过不预安装不必要的系统软件包,您可以优化用户创建时间、启动时间和内存用量。
使用系统配置 XML 文件(以 frameworks/base/data/etc/preinstalled-packages-platform.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
示例
以下示例介绍了最常见的用例
- 对于仅在用户 0 中预安装的系统软件包
<install-in-user-type package="com.android.example"> <install-in user-type="SYSTEM" /> </install-in-user-type>
- 对于要在所有人类用户(例如网络浏览器)上预安装的系统软件包,即要安装在任何类型为
FULL
或PROFILE
的用户上,这将覆盖所有人类用户<install-in-user-type package="com.android.example"> <install-in user-type="FULL" /> <install-in user-type="PROFILE" /> </install-in-user-type>
- 对于要在除个人资料用户外的所有人类用户上预安装的系统软件包。例如,这可以应用于壁纸应用
<install-in-user-type package="com.android.example"> <install-in user-type="FULL" /> </install-in-user-type>
- 某些系统软件包确实需要在所有用户上,而无需考虑类型。在这些情况下,请使用
<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>
- 还可以通过指定各个用户类型来使用更精细的选项。例如,以下示例代码将此软件包安装在用户类型为受管理的个人资料或访客或属于
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 资源值 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-in
和 do-not-install-in
标记),但会将任何未提及的系统软件包视为针对所有用户的 install-in
<integer name="config_userTypePackageWhitelistMode">5</integer>