多用户之分身用户是如何同步安装主用户中已经安装的应用的? 这个问题是最近工作中遇到的一个问题引出的,问题背景如下:
系统设置开启微信分身后,手机安装并设置第三方输入法(如:搜狗输入法)为当前输入法,打开微信,发现主微信中使用的是设置的第三方输入法(搜狗输入法),而微信分身中的使用的输入法是系统默认的百度输入法,两个的输入法不同步问题。
在这个问题背景的牵引下,分析发现,是第三方输入法(搜狗舒服发)在分身用户下没有被安装。
我们先去看下如何创建分身用户的?
创建分身用户的代码接口在哪里?
见:
frameworks/base/core/java/android/os/UserManager.java
/**
2910 * Similar to {@link #createProfileForUser(String, String, int, int, String[])}
2911 * except bypassing the checking of {@link UserManager#DISALLOW_ADD_MANAGED_PROFILE}.
2912 *
2913 * @see #createProfileForUser(String, String, int, int, String[])
2914 * @hide
2915 */
2916 @RequiresPermission(anyOf = {
Manifest.permission.MANAGE_USERS,
2917 Manifest.permission.CREATE_USERS})
2918 public UserInfo createProfileForUserEvenWhenDisallowed(String name,
2919 @NonNull String userType, @UserInfoFlag int flags, @UserIdInt int userId,
2920 String[] disallowedPackages) {
2921 try {
2922 return mService.createProfileForUserEvenWhenDisallowedWithThrow(name, userType, flags,
2923 userId, disallowedPackages);
2924 } catch (ServiceSpecificException e) {
2925 return null;
2926 } catch (RemoteException re) {
2927 throw re.rethrowFromSystemServer();
2928 }
2929 }
其中传入的参数:
name:需要创建的分身用户的名字
userType:创建的用户类型,这里使用的是UserManager.USER_TYPE_PROFILE_MANAGED,分身用户类型
flags:指定用户属性的 UserInfo 标志。如:UserInfo.FLAG_DISABLED
userId:主用户id
disallowedPackages:不允许安装在新建分身用户下的所有应用包,包名集合(此处只能过滤系统应用,不能过滤安装的第三方应用;因为在创建新用户过程中,初始化时,会针对系统应用且只针对系统应用进行同步安装)
上述方法中,创建了新的分身用户,并且过滤掉disallowedPackages中的所有系统应用,同步安装到了新用户目录下(此处省略跟进代码分析具体实现,需要同学自己去跟进查看,后续有时间再详细介绍),关于同步安装系统应用,最后具体的实现代码见:
frameworks/base/services/core/java/com/android/server/pm/Settings.java
void createNewUserLI(@NonNull PackageManagerService service, @NonNull Installer installer,
4176 @UserIdInt