AI手机网,短视频直播 硬改改机 一键新机 群控软件 刷机定制

 找回密码
 立即注册
搜索
查看: 1787|回复: 0

Android用多用户实现应用多开

[复制链接]
发表于 2020-1-10 13:12:50 | 显示全部楼层 |阅读模式
AOSP中的修改framework/base/core/res/res/values/config.xml
  1.   config_multiuserMaximumUsers  支持的最多用户数
  2.    config_multiuserMaxRunningUsers 允许同时运行的用户数
  3.    config_enableMultiUserUI
复制代码
framework/base/services/core/java/com/android/server/pm/UserManagerService.java
private UserInfo createUserInternalUnchecked(String name, int flags, int parentId, String[] disallowedPackages) { 屏蔽掉
  1.      if (isManagedProfile && !canAddMoreManagedProfiles(parentId, false)) {
  2.           Log.e(LOG_TAG, "Cannot add more managed profiles for user " + parentId);
  3.           return null;
  4.      }
复制代码
在Oneplus里是家了一个特殊的flag, 判断这个flag是oneplus(0x04000000), 就不执行上面的return null
com/android/server/pm/PackageManagerService.java: void createNewUser(int userId, String[] disallowedPackages) {
在app里实现
  1. public boolean createUserProfile(){
  2.     UserHandle userHandle = android.os.Process.myUserHandle();
  3.     int userHandleIdentifier = userHandle.getIdentifier();
  4.     mManagedProfileUserInfo = userManager.createProfileForUserEvenWhenDisallowed(createUserName(), UserInfo.FLAG_MANAGED_PROFILE, userHandleIdentifier, disallowedPackages);

  5.     if(mManagedProfileUserInfo != null){
  6.         Log.i(TAG,"createUserProfile 成功!!" );
  7.         startNewUser();
  8.         return true;
  9.     }
  10.     return false;
  11. }
复制代码
ALLOWED_FLAGS_FOR_CREATE_USERS_PERMISSION = UserInfo.FLAG_MANAGED_PROFILE ( 0x00000020 ) | UserInfo.FLAG_EPHEMERAL ( 0x00000100 ) 转入后台,就会被删除 | UserInfo.FLAG_RESTRICTED ( 0x00000008)权限限制,不能安装app或者管理wif | UserInfo.FLAG_GUEST ( 0x00000004 ) | UserInfo.FLAG_DEMO; (0x00000200)
创建用户和Profile的区别: 用户的父亲,是 UserHandle.USER_NULL (-10000), 而Profile的父亲 必须是 普通用户
一加的实现
com.oneplus.settings.multiapp.OPMultiAppListSettings
UserManager.setUserRestriction("no_add_user", false, UserHandle.OWNER)
UserManager.createProfileForUser('username', 0x4000060, Process.myUserHandle().getIdentifier());
        标志: 一加, 0x20(FLAG_MANAGED_PROFILE), 0x40 (FLAG_DISABLED)
然后删掉不必要的应用
在UserManagerService 中 对 createUserInternalUnchecked 进行了改造
canAddMoreManagedProfile 通过Oppo标志直接屏蔽
UserId直接改成 999 if ((OpFeatures.isSupport(v6_1))&&((0x04000000&xFlags))) { v0 = 999; }else {
v0_3 = this.getNextAvailableId(); }
Profile创建好之后
UserManager.setUserName(ManagedProfileOrUserInfo.id, this.getString(0x7F120C14)); //设置名称 UserManager.setUserEnabled(ManagedProfileOrUserInfo.id); //启用
startUserInBackground(id)
安装已经存在的包 PackageManager.installExistingPackageAsUser
AOSP中管理Profile的代码
aosp/developers/samples/android/admin/BasicManagedProfile aosp/development/samples/browseable/BasicManagedProfile aosp/packages/apps/ManagedProvisioning ... startManagedProfileOrUserProvisioning
PackageManagerShellCommand 分析
runCreateUser()
pm create-user --profileOf 0 --managed
最终到 createUserInternalUnchecked
hook住 canAddMoreManagedProfiles 和 getNextAvailableId
createProfileForUser 传递 disallowedPackages
联想
  1. private UserInfo getUsefulUser(String userName, String pkgName, boolean isFensheng) {
  2.     UserInfo userInfo;
  3.     StringBuilder sb = new StringBuilder();
  4.     UserManager userManager = (UserManager) this.mContext.getSystemService("user");
  5.     List<UserInfo> users = userManager.getUsers();
  6.     this.mMultipleSpaceCount = 0;
  7.     users.sort(new Comparator<UserInfo>() {
  8.         public int compare(UserInfo userInfo, UserInfo userInfo2) {
  9.             return userInfo.getMultipleSpaceId() - userInfo2.getMultipleSpaceId();
  10.         }
  11.     });
  12.     if (users == null || users.size() <= 1) {
  13.         userInfo = null;
  14.     } else {
  15.         userInfo = null;
  16.         for (UserInfo userInfo2 : users) {
  17.             boolean isSecuritySpaceUser = MultiSpaceConstant.isSecuritySpaceUser(userInfo2.id);
  18.             if ((!isFensheng && isSecuritySpaceUser) || (isFensheng && userInfo2 != null && userInfo2.isMultipleSpace() && !isSecuritySpaceUser)) {
  19.                 if (TextUtils.isEmpty(sb.toString())) {
  20.                     sb.append(userInfo2.id);
  21.                 } else {
  22.                     sb.append("," + userInfo2.id);
  23.                 }
  24.                 if (!isSecuritySpaceUser) {
  25.                     this.mMultipleSpaceCount++;
  26.                 }
  27.                 if (userInfo == null && ((!isFensheng && isSecuritySpaceUser) || !isInstalled(pkgName, userInfo2.id))) {
  28.                     userInfo = userInfo2;
  29.                 }
  30.             }
  31.         }
  32.     }
  33.     this.mSplitUserIsExist = true;
  34.     if (userInfo != null) {
  35.         return userInfo;
  36.     }
  37.     if (this.mMultipleSpaceCount >= 4 && !isFensheng) {    //因为isFensheng为true, 这个条件永不满足
  38.         return userInfo;
  39.     }
  40.     this.mSplitUserIsExist = false;
  41.     Settings.Secure.putString(this.mContext.getContentResolver(), KEY_MULTI_SPACE_USERS, sb.toString());
  42.     UserInfo createUser = userManager.createUser(userName, getUserInfoFlag(isFensheng) | 16);
  43.     Settings.Secure.putString(this.mContext.getContentResolver(), KEY_MULTI_SPACE_USERS, (String) null);
  44.     Log.v(TAG, "Creating managed profile with name " + userName + " " + pkgName + " targetUserInfo = " + createUser);
  45.     return createUser;
  46. }
复制代码
FLAG_MULTIPLE_SPACE = 0x80000800; FLAG_SECURITY_SPACE = 0x80001000; FLAG_MANAGED_PROFILE = 0x20 FLAG_MASK_MULTIPLE_SPACE_ID = 0xFF00000 FLAG_MASK_USER_TYPE = 0xFFFF FLAG_INITIALIZED = 0x10 (创建时带标志,不会初始化一些包)
然后 startUserInBackground installBasicApp

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

技术交流售后群

QQ|小黑屋|手机版|站点找错-建议|AI手机网 |Sitemap



GMT+8, 2024-5-20 06:28 , Processed in 0.137279 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表