Android多用户基础问题

1.源码位置

frameworks/base/core/java/android/os/UserManager.java
frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java

重要接口

    /**
     * Returns whether this device supports multiple users with their own login and customizable
     * space.
     * @return whether the device supports multiple users.
     */
    public static boolean supportsMultipleUsers() {
        return getMaxSupportedUsers() > 1
                && SystemProperties.getBoolean("fw.show_multiuserui",
                Resources.getSystem().getBoolean(R.bool.config_enableMultiUserUI));
    }
    
    
    /**
     * Returns the maximum number of users that can be created on this device. A return value
     * of 1 means that it is a single user device.
     * @hide
     * @return a value greater than or equal to 1
     */
    @UnsupportedAppUsage
    public static int getMaxSupportedUsers() {
        // Don't allow multiple users on certain builds
        if (android.os.Build.ID.startsWith("JVP")) return 1;
        return Math.max(1, SystemProperties.getInt("fw.max_users",
                Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers)));
    }
    
      /**
     * Returns true if the user switcher is enabled (regardless of whether there is anything
     * interesting for it to show).
     *
     * @return true if user switcher is enabled
     * @hide
     */
    @RequiresPermission(anyOf = {
            android.Manifest.permission.MANAGE_USERS,
            android.Manifest.permission.CREATE_USERS // And INTERACT_ if diff profile group
    })
    @UserHandleAware
    public boolean isUserSwitcherEnabled() {
        return isUserSwitcherEnabled(true);
    }

    /**
     * Returns true if the user switcher should be shown.
     *
     * @param showEvenIfNotActionable value to return if the feature is enabled but there is nothing
     *                                actionable for the user to do anyway
     * @return true if user switcher should be shown.
     * @hide
     */
    @RequiresPermission(anyOf = {
            android.Manifest.permission.MANAGE_USERS,
            android.Manifest.permission.CREATE_USERS // And INTERACT_ if diff profile group
    })
    @UserHandleAware
    public boolean isUserSwitcherEnabled(boolean showEvenIfNotActionable) {

        try {
            return mService.isUserSwitcherEnabled(showEvenIfNotActionable, mUserId);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
    }
    /**
     * Returns the user handles for all users on this device, based on the filtering parameters.
     *
     * @param excludeDying specify if the list should exclude users being removed.
     * @return the list of user handles.
     * @hide
     */
    @SystemApi
    @RequiresPermission(anyOf = {
            android.Manifest.permission.MANAGE_USERS,
            android.Manifest.permission.CREATE_USERS
    })
    public @NonNull List<UserHandle> getUserHandles(boolean excludeDying) {
        List<UserInfo> users = getUsers(/* excludePartial= */ true, excludeDying,
                /* excludePreCreated= */ true);
        List<UserHandle> result = new ArrayList<>(users.size());
        for (UserInfo user : users) {
            result.add(user.getUserHandle());
        }
        return result;
    }

2.配置多用户模式的开启和关闭

需要通过overlay的方式修改framework/base/core/res/res/values/config.xml的“config_multiuserMaximumUsers”和"config_enableMultiUserUI"参数

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

当为1时,表示不支持多用户;当大于1时,表示支持多用户的最大个数

config_enableMultiUserUI

当为false时,多用户功能处于停用状态;当为true时,多用户功能处于启用状态

手机系统需要修改的文件位于:

device/xxx/overlay/frameworks/base/core/res/res/values/config.xml

车机系统里需要修改的文件位于:

packages/services/Car/car_product/overlay/frameworks/base/core/res/res/values/config.xml

8775的Android14版本中,修改的文件位于:vendor/qcom/proprietary/resource-overlay/gen4/Frameworks/res/values/config.xml

3.APP获取多用户的相关参数:

方法名返回数据
UserManager.supportsMultipleUsers()是否支持多用户
UserManager.getMaxSupportedUsers()获取支持的多用户的最大个数
UserManager.getUserName()获取当前用户的名称
UserManager.getUserHandle()获取当前用户的id

4.以下信息有助于说明 adb 在多用户条件下的行为方式:

  • adb(或者更准确地说,是 adbd 守护程序)始终以系统用户(用户 ID = 0)身份运行,而不管当前用户是哪个用户。因此,取决于用户的设备路径(如 /sdcard/)始终会被解析为系统用户的路径。如需了解详情,请参阅设备路径

  • 如果未指定默认用户,则每个 adb 子命令都有一个不同的用户。最佳做法是使用 am get-current-user 检索用户 ID,然后明确地对支持 --user <userId> 的所有命令使用该标记。在 Android 9 之前,并非所有命令都支持显式用户标志。

  • 从 Android 9 开始,访问次要用户的 /sdcard 路径的请求会被拒。如需详细了解如何在测试期间检索文件,请参阅多用户数据的内容提供程序

5.多用户系统行为

将用户添加到设备后,当另一个用户位于前台时,某些功能会受到限制。由于应用程序数据是按用户分开的,因此这些应用程序的状态因用户而异。例如,发送至当前未关注的用户帐户的电子邮件将不可用,直到该用户和帐户在设备上处于活动状态。

注意:要为辅助用户启用或禁用电话和短信功能,请转至设置 > 用户,选择用户,然后将允许电话和短信设置切换为关闭。

当辅助用户在后台时存在一些限制。例如,后台辅助用户无法显示用户界面或激活蓝牙服务。此外,如果设备需要额外的内存用于前台用户的操作,系统进程将停止后台辅助用户。

在 Android 设备上使用多个用户时,请记住以下行为:

  • 一次性显示单个用户的所有帐户的通知。

  • 其他用户的通知只有在激活后才会显示。

  • 每个用户都有一个工作区来安装和放置应用程序。

  • 任何用户都无法访问其他用户的应用程序数据。

  • 任何用户都可以影响所有用户已安装的应用程序。

  • 管理员用户可以删除应用程序,甚至可以删除辅助用户建立的整个工作区。

  • 默认情况下,退出访客模式时,访客用户会话中的信息不会保留。如果您希望保留来宾用户会话中的信息,则必须创建一个资源覆盖文件,将config_guestUserAllowEphemeralStateChange设置为false 。有关创建覆盖文件的更多信息,请参阅使用资源覆盖自定义构建

6.汽车用户类型

汽车版本对于以下类型的用户也值得注意:

  • 无头系统用户。系统用户承载所有系统服务。为了支持 Automotive 上的多个用户,系统用户也必须是无头的。只有一名无头用户。无头系统用户:

    • 必须始终在后台运行。

    • 用户无法直接删除或访问,设备配置情况除外。例如,用户无法切换到此用户类型来执行下载应用程序或添加帐户等任务。

    • 只能通过恢复出厂设置来清除。

  • 普通用户。与上面描述的次要用户相同,除了次要用户:

    • 不要在后台运行(切换后)。

    • 可以直接通过用户界面创建。

    • 分离应用程序数据,但共享一些系统范围的设置。例如,Wi-Fi 和蓝牙。

注意事项

以下例外情况适用于无头系统用户和汽车领域的常规(二级)用户:

  • 无头系统用户不支持工作配置文件。

  • 默认情况下,常规(次要)用户拥有通话和短信的完全访问权限。

  • 默认情况下,常规(辅助)用户不会在后台运行。

启用无头系统用户

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

  • 系统用户是无头的,仅在后台运行。

  • 人类用户不与系统用户交互。

为了启用无头系统用户,设备制造商必须启用如上所述的多用户。

当启用无头用户时:

  1. 要将设备声明为 Automotive,请添加功能android.hardware.type.automotive

  2. ro.fw.headless_system_user设置为true

  3. config_multiuserMaximumUsers的值设置为2 (或更高)。

有关详细信息,请参阅汽车中的多用户支持

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部