支持多用户

通过将用户账号和应用数据进行分离,Android 支持在一台 Android 设备上添加多名用户。例如,父母可能会允许他们的孩子使用家庭平板电脑,一个家庭可以共用一辆汽车,或者应急响应团队可能会共用一台移动设备用于呼叫值班。

术语

Android 在描述 Android 用户和账号时会使用以下术语。

常规

Android 设备管理使用以下常规术语:

  • 用户:每个用户分别由一个自然人使用。每个用户都有不同的应用数据和一些独特的设置,且每个用户都拥有自己的界面,以使不同用户之间的切换更明显。当某个用户处于活动状态时,另一个用户可以在后台运行;系统会在适当的时候尝试关闭用户来节约资源。次要用户可以通过界面直接创建,也可以通过设备管理应用进行创建。
  • 账号:账号包含在用户中,但并非由某个用户定义;用户既不由任何特定账号进行定义,也不会关联到任何特定账号。用户和个人资料包含其各自的唯一账号;不过,即使没有用户和个人资料,账号也可以正常发挥作用。账号列表因用户而异。如需了解详情,请参阅 Account 类的定义。
  • 个人资料:个人资料具有独立的应用数据,但会共享一些系统范围的设置(例如 Wi-Fi 和蓝牙)。个人资料会与已存在用户绑定在一起,并是已存在用户的子集。一个用户可以有多份个人资料。个人资料通过设备管理应用进行创建。个人资料由创建个人资料的用户进行定义,它与父用户之间总是存在不可变的关联。个人资料的存在时间不会超出创建用户的生命周期。
  • 应用:应用的数据存在于各关联用户中。一个应用的数据与同一用户的其他应用的数据以沙盒的形式隔离。同一用户的应用可以通过 IPC 彼此交互。如需了解详情,请参阅Android 企业版

用户类别

Android 设备管理使用以下用户类别。

  • 系统用户:添加到设备的第一个用户。除非恢复出厂设置,否则无法移除系统用户;此外,即使其他用户在前台运行,系统用户也会始终处于运行状态。该用户还拥有特殊权限以及只有自己可以设定的设置。
  • 无头系统用户:当设备配置为在无头系统用户模式下运行(通过设置 ro.fw.mu.headless_system_user=true)时,添加到设备的第一个用户。无头系统用户始终在后台运行,此类设备需要其他前台用户才能进行用户互动。
  • 次要用户:除系统用户之外添加到设备的任何用户。次要用户可以移除(由次要用户自行移除或由管理员用户移除),且不会影响设备上的其他用户。此类用户可以在后台运行,在后台运行时可以继续连接到网络。
  • 访客用户:临时的次要用户。访客用户设置中有明确的删除选项,当访客用户不再有用时,可快速将其删除。一次只能有一个访客用户。
  • 管理员用户:有权创建和移除其他用户以及控制一些常规多用户设置的用户。默认情况下,只有系统用户属于管理员用户。

个人资料类别

Android 使用以下个人资料类别:

  • 受管理个人资料:由应用创建,包含工作数据和应用。受管理个人资料专门由个人资料所有者(即创建企业资料的应用)管理。启动器、通知和最近的任务由父用户和企业资料共享。
  • 受限个人资料:由父用户控制的账号,父用户可以控制哪些应用在受限个人资料中可用。仅适用于平板电脑和电视设备。
  • 克隆个人资料:Android 支持创建单独的克隆个人资料用户类型,以支持在设备上运行单个应用的两个实例。AOSP 不提供对该功能的端到端支持。OEM 需要添加自定义设置,以便为 Android 用户提供完整功能。

用户类型

Android 11 已将上述用户和个人资料分类归纳为定义明确的用户类型,用于代表 Android 多用户功能允许使用的各种不同类型的用户和个人资料。

预定义的 AOSP 用户类型在 frameworks/base/core/java/android/os/UserManager.java 中定义,目前包括:

  • 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
  • android.os.usertype.profile.CLONE

原始设备制造商 (OEM) 可以通过覆盖 frameworks/base/core/res/res/xml/config_user_types.xml 文件来配置这些用户类型。这有助于更改每种用户类型的默认配置,包括其默认限制、图标、标记和允许配置的最大用户数。

除了可配置的 AOSP 用户类型外,OEM 还可以使用 frameworks/base/core/res/res/xml/config_user_types.xml 文件定义新的个人资料类型。这样,OEM 如有需要,就可以引入自己的非受管理个人资料类型。不过,OEM 有责任根据支持所做更改的需要对平台进行修改,包括修改用于检查受管理个人资料的任何代码,使其现在可以根据情况处理新的个人资料类型。

支持多用户

默认情况下,多用户功能处于停用状态。如需启用这项功能,设备制造商必须定义一个资源叠加层,以替换 frameworks/base/core/res/res/values/config.xml 中的以下值:

<!--  Maximum number of supported users -->
<integer name="config_multiuserMaximumUsers">1</integer>
<!--  Whether Multiuser UI should be shown -->
<bool name="config_enableMultiUserUI">false</bool>

如需应用此叠加层并在设备上启用访客用户和次要用户,请使用 Android 构建系统的 DEVICE_PACKAGE_OVERLAYS 功能执行以下操作:

  • config_multiuserMaximumUsers 的值替换为大于 1 的值
  • config_enableMultiUserUI 的值替换为 true

设备制造商可以决定用户数上限。如果设备制造商或其他人修改了设置,他们必须确保短信和电话通讯遵循 Android 兼容性定义文档 (CDD) 中定义的说明。

管理多用户

程序化地调用 DevicePolicyManager 类中的 API 的应用负责管理用户和个人资料(受限个人资料除外),并对用户和个人资料的使用加以限制。

企业可以将上述类型与 DevicePolicyManagerUserManager API 结合使用,以针对其用例构建独特的解决方案,从而借助用户和个人资料来管理设备上应用和数据的生命周期和适用范围。

多用户系统行为

将用户添加到设备后,当其他用户在前台活动时,一些功能会受限制。由于应用数据会按用户分开,因此,这些应用的状态也会因用户而异。例如,如果某个用户当前不在前台,那么在该用户及其账号在设备上处于活动状态之前,发往该用户账号的电子邮件将无法查看。

注意:如需为次要用户启用或停用电话和短信功能,请依次转到“设置”>“用户”,选择相应用户,然后将“允许接打电话和收发短信”设置切换到关闭状态。

次要用户在后台活动时会受到一些限制。例如,后台次要用户无法显示界面或开启蓝牙服务。此外,如果设备需要更多内存才能满足前台用户的操作需求,系统进程将暂停后台次要用户的活动。

在 Android 设备上使用多用户功能时,请注意以下几点:

  • 通知会同时出现在一位用户的所有账号中。
  • 其他用户的通知在激活用户后才会显示。
  • 每位用户都会获得用于安装和放置应用的工作区。
  • 任何用户都无权访问其他用户的应用数据。
  • 任何用户都可以影响为所有用户安装的应用。
  • 管理员用户可以移除次要用户所创建的应用乃至整个工作区。
  • 默认情况下,退出访客模式时,系统不会保留访客用户会话中的信息。 如果您希望保留访客用户会话中的信息,则必须创建一个资源叠加层文件,以便将 config_guestUserAllowEphemeralStateChange 设置为 false。如需详细了解如何创建叠加层文件,请参阅利用资源叠加层自定义 build

Android Automotive 多用户

Android Automotive 依靠 Android 的多用户实现来提供共用设备体验。

Automotive 用户类型

值得注意的是,除了上面列出的用户类型之外,Automotive 版本还包含以下类型的用户:

  • 无头系统用户:此类系统用户负责托管所有系统服务。 如需在 Automotive 中支持多用户,系统用户也必须是无头用户。 只有一个无头用户。无头系统用户应遵守以下要求:
    • 必须始终在后台运行。
    • 无法直接由用户移除或访问,除非是在“设备配置”的情况下。例如,用户无法切换到这种用户类型来执行下载应用或添加账号等任务。
    • 只能通过恢复出厂设置清除。
  • 常规用户:与上文所述的次要用户相同,不过次要用户具有以下特点:
    • 不会在后台运行(在切换成其他用户之后)。
    • 可通过界面直接创建。
    • 具有独立的应用数据,但会共享一些系统范围内的设置。例如,WLAN 和蓝牙。

注意事项

以下例外情况适用于 Automotive 中的无头系统用户和常规(次要)用户:

  • 无头系统用户不支持工作资料。
  • 默认情况下,常规(次要)用户拥有通话和短信的完全访问权限。
  • 默认情况下,常规(次要)用户不会在后台运行。

启用无头系统用户

从 Android 10 开始,多用户功能可用于 Automotive 用例。重要区别包括:

  • 系统用户是无头用户,仅在后台运行。
  • 人类用户不与系统用户互动。

如需启用无头系统用户,设备制造商必须按照上文所述启用多用户功能。

启用无头用户后:
  1. 如需将设备声明为 Automotive,请添加 android.hardware.type.automotive 功能。
  2. ro.fw.headless_system_user 设为 true
  3. config_multiuserMaximumUsers 的值设为 2(或更高的值)。

如需了解详情,请参阅 Automotive 中的多用户支持

多个屏幕上的 Android Automotive 多用户功能

Android 14 中新增了一项实验性功能,允许当前前台用户的完全次要用户在系统分配的屏幕上启动 activity 和访问界面。借助此功能,Android Automotive OS 中的多个并发用户可提升车内体验,在单个 Android 实例中为多名乘客提供专属界面体验。

如需启用此功能以用于开发用途,设备制造商必须定义一个资源叠加层,以替换 frameworks/base/core/res/res/values/config.xml 中的以下值:

<!-- Whether the device allows users to start in background visible on displays.
    Should be false for all devices in production. Can be enabled only for development use
    in automotive vehicles with passenger displays. -->

<bool name="config_multiuserVisibleBackgroundUsers">false></bool>

您可以通过启用以下其他配置,尝试提供仅乘客(没有司机)体验:

<!-- Whether the device allows users to start in background visible on the default display.
    Should be false for all devices in production. Can be enabled only for development use
    in passenger-only automotive build (i.e., when Android runs in a separate system in the
    back seat to manage the passenger displays).
    When set to true, config_multiuserVisibleBackgroundUsers must also be true. -->

<bool name="config_multiuserVisibleBackgroundUsersOnDefaultDisplay">false</bool>

在 Android 14 中,您可以为身为访客用户的多名乘客启用车内体验。如需启用多个访客用户以用于开发用途,设备制造商必须定义一个资源叠加层,用于在 frameworks/base/core/res/res/xml/config_user_types.xml 中配置允许的访客用户数上限,如下例所示:

<user-types>
   <full-type
       name="android.os.usertype.full.GUEST"
       max-allowed='4'>
       <default-restrictions no_factory_reset="true"
           no_remove_user="true"
           no_modify_accounts="true"
           no_install_apps="true"
           no_install_unknown_sources="true"
           no_uninstall_apps="true"/>
   </full-type>
</user-types>