实现自定义用户类型

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

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

自定义

为了自定义 AOSP 用户类型并定义新的个人资料类型,OEM 必须使用首选的自定义设置叠加 config_user_types.xmlconfig_user_types.xml 文件包含参考实现和完整的可配置属性列表。

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

各类用户当前的自定义限制如下:

  • 您可以对个人资料进行完全自定义和定义。在这种情况下,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 类型。