Android多用户基础问题

Android多用户基础问题

1.源码位置

bash 复制代码
frameworks/base/core/java/android/os/UserManager.java
frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java

重要接口

bash 复制代码
    /**
     * 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"参数

XML 复制代码
<!--  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 (或更高)。

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

相关推荐
CANI_PLUS6 小时前
ESP32将DHT11温湿度传感器采集的数据上传到XAMPP的MySQL数据库
android·数据库·mysql
来来走走7 小时前
Flutter SharedPreferences存储数据基本使用
android·flutter
安卓开发者9 小时前
Android模块化架构深度解析:从设计到实践
android·架构
雨白9 小时前
HTTP协议详解(二):深入理解Header与Body
android·http
阿豪元代码9 小时前
深入理解 SurfaceFlinger —— 如何调试 SurfaceFlinger
android
阿豪元代码10 小时前
深入理解 SurfaceFlinger —— 概述
android
CV资深专家11 小时前
Launcher3启动
android
stevenzqzq11 小时前
glide缓存策略和缓存命中
android·缓存·glide
雅雅姐12 小时前
Android 16 的用户和用户组定义
android
没有了遇见12 小时前
Android ConstraintLayout 之ConstraintSet
android