Android多用户场景下如何全局列包及为所有用户安装应用包
问题1:程序化获取设备全局所有已安装应用包的实现方案
你当前的应用为系统应用,可按如下逻辑实现需求:
- 先申请系统级权限
android.permission.INTERACT_ACROSS_USERS_FULL和android.permission.MANAGE_USERS,这两个权限仅系统签名/预装特权应用可正常获取 - 通过
UserManager.getUsers()接口获取设备上所有已创建的用户ID列表 - 遍历每个用户ID,调用
PackageManager.getInstalledApplications(0, userId)获取对应用户下的已安装应用列表,合并所有结果即为设备全局的已安装应用集合 - 也可以直接调用隐藏API
PackageManager.getInstalledPackages(PackageManager.MATCH_ALL_USERS)直接获取全局列表,需注意隐藏API的跨版本兼容性问题
问题2:程序化实现为所有用户安装应用包的实现方案
结合你测试验证的APK全局存储、仅用户数据隔离的特性,可通过以下方案实现:
- 首先沿用现有逻辑,调用
PackageInstaller.Session完成当前用户的应用安装,此时APK文件已写入全局的/data/app/目录,全设备共享该APK文件 - 遍历除当前用户外的其他所有用户ID,调用
PackageManager.installExistingPackage(packageName, PackageManager.INSTALL_REASON_USER, userId)方法,直接将已存在的APK关联到对应用户下,不需要重复上传APK文件 - 若需要一次性直接为所有用户安装,可在创建
PackageInstaller.SessionParams时添加隐藏FlagINSTALL_ALL_USERS,该Flag会直接将安装的应用默认对所有用户生效,同样需注意隐藏API的系统版本适配
注意事项
- 上述所有跨用户操作的前提是你的应用持有对应系统级权限,且运行在Android 10及以上版本时适配了分区存储等多用户兼容规则
- 你测试发现的同包名版本号全局统一的特性是Android多用户机制的固有设计,APK本体是全局唯一的,各用户仅隔离应用数据和启用状态,因此为所有用户安装时仅需上传一次最高版本的APK即可
内容的提问来源于stack exchange,提问作者nglazkov
相关产品推荐
相关产品推荐

