欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > Android多用户基础问题

Android多用户基础问题

2024/10/25 0:28:08 来源:https://blog.csdn.net/netwalk/article/details/140274309  浏览:    关键词:Android多用户基础问题

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*/@UnsupportedAppUsagepublic static int getMaxSupportedUsers() {// Don't allow multiple users on certain buildsif (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})@UserHandleAwarepublic 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})@UserHandleAwarepublic 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 (或更高)。

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com