实现自定义用户类型

Android 11 引入了明确定义的用户类型的概念,代表 Android 多用户功能允许的所有不同类型的用户。借助此功能,OEM 可以自定义预定义的 AOSP 用户类型并定义新的资料类型。有关详情,请参阅关于用户类型的部分。

本页面详细介绍了自定义用户类型所需的实现指南。

自定义

为了自定义 AOSP 用户类型和定义新的资料类型,OEM 必须替换 config_user_types.xml 并进行首选的自定义。config_user_types.xml 文件包含参考实现和可配置属性的完整列表。

config_user_types.xml 文件中指定的任何属性(例如 default-restrictions)都会覆盖 AOSP 默认值。任何未指定的属性都将遵循 AOSP 默认值。更改大多数属性(例如资料类型的徽章属性)会影响该用户类型的现有用户。但是,由于 default-restrictions 仅在创建用户时应用,因此,如果通过 OTA 更改了 config_user_types.xml 文件,则修改此特定属性对现有用户没有影响。同样,指定最大用户数仅在创建新用户时适用;不会移除现有用户。

目前,每种用户类型的自定义限制如下:

  • 可以完全自定义和定义资料。在这种情况下,OEM 负责进行平台修改,以使其自定义资料在 Android 中获得支持,因为 AOSP 仅支持预定义的 AOSP 用户类型。
  • 无法定义完整用户,只能自定义其 default-restrictions 属性。
  • 无法使用此机制自定义系统用户。在这种情况下,可以使用 com.android.internal.R.array.config_defaultFirstUserRestrictions 设置 default-restrictions。有关详情,请参阅 config.xml

修改现有用户类型

可以通过替换其属性来自定义现有用户类型,如以下代码示例所示:

<user-types version="0">
    <full-type name="android.os.usertype.full.SECONDARY" >
        <default-restrictions no_sms="true" />
    </full-type>

    <profile-type
        name='android.os.usertype.profile.MANAGED'
        max-allowed-per-parent='2'
        icon-badge='@android:drawable/ic_corp_icon_badge_case'
        badge-plain='@android:drawable/ic_corp_badge_case'
        badge-no-background='@android:drawable/ic_corp_badge_no_background' >
        <badge-labels>
            <item res='@android:string/managed_profile_label_badge' />
            <item res='@android:string/managed_profile_label_badge_2' />
        </badge-labels>
        <badge-colors>
            <item res='@android:color/profile_badge_1' />
            <item res='@android:color/profile_badge_2' />
        </badge-colors>
        <default-restrictions no_sms="true" no_outgoing_calls="true" />
    </profile-type>
</user-types>

在此代码示例中,通过修改支持的属性来自定义以下 AOSP 用户类型:

  • 完整用户 android.os.usertype.full.SECONDARY

    • 通过指定 default-restrictions no_sms="true",将 no_sms 的默认限制设置为 true。
  • 资料用户 android.os.usertype.profile.MANAGED

    • 通过设置 max-allowed-per-parent='2',允许每个父用户拥有两个资料。
    • 使用 icon-badgebadge-plainbadge-no-backgroundbadge-labelsbadge-colors 将徽章属性设置为选定值。
    • 通过指定 default-restrictions no_sms="true" no_outgoing_calls="true",将 no_smsno_outgoing_calls 的默认限制设置为 true。

有关这些属性的含义和默认值,请参阅 UserTypeFactory.javaUserTypeDetails.java

定义自定义资料类型

以下代码示例展示了如何定义新的自定义资料类型:

<user-types version="1">
    <profile-type
        name="com.example.profilename"
        max-allowed-per-parent="2" />

    <change-user-type
        from="android.os.usertype.profile.MANAGED"
        to="com.example.profilename"
        whenVersionLeq="1" />
</user-types>

在此代码示例中,com.example.profilename 资料类型的定义如下:

  • 对于每个父用户两个资料,max-allowed-per-parents 设置为 2

  • change-user-type:通过 OTA 将设备从 user-type 版本 <= 1 升级时,将所有类型为 android.os.usertype.profile.MANAGED 的现有受管理资料转换为新的 com.example.profilename 类型。