1. Android For Work介绍
在Android 5.0及更高版本可以通过多用户(multi user)、配置文件(managed profiles)和企业移动管理(EMM)应用,配合文件加密, verified boot和SELinux等安全机制实现企业级Android终端设备解决方案。
基本概念
DO和BYOD是Android For Work目的下的两个应用场景,Android Enterprise是Google针对AFW推出的自家产品。
实现方式
通过创建一个工作用户,在工作用户数据空间下存放工作相关的配置文件实现和个人用户差异化的目的。
2. 多用户应用多开验证
通过上面AFW的介绍,发现BYOD的方式和普通用户应用多开的诉求很契合,因此接下来通过激活BYOD看看多开的效果。
正常激活步骤
步骤一: 下载和安装testdpc工具;
步骤二: 将testdpc激活为设备管理器:
步骤三: 进入Setup Test DPC,勾选Skip encryption后进行Profile的创建;
以上步骤搭配原生Launcher3,在桌面抽屉页面会显示个人区和工作区。
激活流程分析
激活过程调用栈:
[SystemServer] Settings.createNewUserLI [SystemServer] PackageManagerService.createNewUser [SystemServer] UserManagerService.createUserInternalUnchecked [SystemServer] mUserManager.createProfileForUserEvenWhenDisallowed [APP:ManagedProvision] managedprovisioning.CreateManagedProfileTask(run) [APP:ManagedProvision] managedprovisioning.ProfileOwnerProvisioningController.setUpTasksManagedProfile [APP:ManagedProvision] managedprovisioning.ProvisioningManager(maybeStartProvisioning) [APP:ManagedProvision] managedprovisioning.PreProvisioningActivity(startProvisioning) [APP:ManagedProvision] managedprovisioning.PreProvisioningController(isEncryptionRequired) [APP:test dpc] testdpc.SetupManagementFragment (maybeLaunchProvisioning,ACTION_PROVISION_MANAGED_PROFILE)
角色分析:
- test dpc应用程序用于引导ProfileOwner创建和设备管理演示程序的作用;
- ManagedProvision应用程序用于配置Profile文件,最终调用UserManager创建ProfileOwner;
3. 开启多个应用分身
原生默认支持最大用户数量只有2个,而ManagerProfile数量为1个,如果要实现多个分身要对系统进行二次开发。
第一步: 解除UserManager最大用户数的限制
/frameworks/base/core/res/res/values/config.xml中搜索“config_multiuserMax…” 或者 UserManager.getMaxSupportedUsers;
第二步: 解除ManagerProfile数量限制
UserManagerService.MAX_MANAGED_PROFILES 或者UserManagerService.getMaxManagedProfiles;
第三步: 解除DevicePolicyManagerService限制
临时方法是在ManagedProvision应用的CreateManagedProfileTask创建用户的时候配置去掉FLAG_DISABLED;
public void run(int userId) {
startTaskTimer();
final Set nonRequiredApps = mNonRequiredAppsLogic.getSystemAppsToRemove(userId);
UserInfo userInfo = mUserManager.createProfileForUserEvenWhenDisallowed(
mContext.getString(R.string.default_managed_profile_name),
UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_DISABLED,
userId, nonRequiredApps.toArray(new String[nonRequiredApps.size()]));
if (userInfo == null) {
error(0);
return;
}
mProfileUserId = userInfo.id;
mNonRequiredAppsLogic.maybeTakeSystemAppsSnapshot(userInfo.id);
stopTaskTimer();
success();
}
参考
https://source.android.google.cn/docs/devices/admin?hl=en
https://developers.google.cn/android/work/overview
https://developer.android.google.cn/work/managed-profiles?hl=en