多用户之分身用户如何同步安装主用户中已安装的应用?

本文探讨了在Android系统中,如何在创建分身用户后,同步安装主用户已安装的应用,特别是第三方输入法。通过分析Android源码,指出在`UserManager`和`PackageManagerService`中的关键方法,如`installExistingPackageAsUser()`,来实现在分身用户中安装主用户的应用,确保输入法等应用在主副微信之间的同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多用户之分身用户是如何同步安装主用户中已经安装的应用的? 这个问题是最近工作中遇到的一个问题引出的,问题背景如下:
系统设置开启微信分身后,手机安装并设置第三方输入法(如:搜狗输入法)为当前输入法,打开微信,发现主微信中使用的是设置的第三方输入法(搜狗输入法),而微信分身中的使用的输入法是系统默认的百度输入法,两个的输入法不同步问题。
在这个问题背景的牵引下,分析发现,是第三方输入法(搜狗舒服发)在分身用户下没有被安装。
我们先去看下如何创建分身用户的?
创建分身用户的代码接口在哪里?
见:
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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值