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 开始,多用户功能可用于汽车用例。重要的区别包括:
-
系统用户是无头的,仅在后台运行。
-
人类用户不与系统用户交互。
为了启用无头系统用户,设备制造商必须启用如上所述的多用户。
当启用无头用户时:
-
要将设备声明为 Automotive,请添加功能
android.hardware.type.automotive
。 -
将
ro.fw.headless_system_user
设置为true
。 -
将
config_multiuserMaximumUsers
的值设置为2
(或更高)。
有关详细信息,请参阅汽车中的多用户支持。