如何在已获取Root权限的安卓设备上安装同一款应用的两个版本?
已Root安卓设备安装同应用双实例操作指南(无第三方双开工具)
首先明确:已Root的安卓设备完全可以不依赖Dual Space等第三方双开工具实现同应用双实例安装,以下是两种可落地的稳定方案:
方案1:利用安卓原生多用户/工作资料特性(无需修改APK,稳定性最高)
该方案无需改动应用本身,哪怕是拆分APK、有复杂依赖的应用也能完美运行,优先推荐使用:
- 确认你的ROM支持多用户(安卓5.0以上绝大多数官方/第三方ROM都默认支持),给终端模拟器授予Root权限
- 执行命令创建独立的工作资料用户:
pm create-user --profileOf 0 --managed AppClone_01,其中0是主用户ID,AppClone_01可以自定义为你想要的名称 - 执行
pm list users查看刚创建的用户对应的ID,记下来备用 - 执行命令给目标应用分配跨用户交互权限:
pm grant [目标应用包名] android.permission.INTERACT_ACROSS_USERS,把占位的包名替换为你要克隆的应用包名 - 执行命令将已安装的应用同步到新用户空间:
pm install-existing --user [刚才记下的新用户ID] [目标应用包名] - 操作完成后你就可以在主空间和独立的工作资料空间分别打开同一个应用,二者数据完全隔离,互不干扰
方案2:修改包名重签方案(适配不想启用多用户的场景)
如果不想用多用户特性,可以通过适配修改包名的逻辑解决拆分APK/复杂依赖应用的改包失效问题:
- 先将目标应用的所有拆分APK(包括base.apk、split_config_xxx.apk等所有分片文件)全部导出到本地
- 对每一个分片APK执行反编译操作:
apktool d [分片APK文件名] - 打开base.apk反编译后的
AndroidManifest.xml文件,修改根节点的package属性为自定义的新包名,比如原包名是com.xxx.app,可以改成com.xxx.app.clone - 全局替换所有反编译文件夹内的原包名为新包名,覆盖范围包括smali代码路径、资源文件里的包名引用、Manifest文件中provider、service等组件声明的authorities等属性
- 逐个重新编译所有修改后的分片文件:
apktool b [反编译后的文件夹路径] -o [新的分片APK文件名] - 用同一个签名文件对所有新生成的分片APK统一签名:
apksigner sign --ks [你的签名文件路径] --out [签名后输出路径] [待签名分片APK路径] - 按顺序安装所有签名后的分片APK,即可完成第二个实例的安装
注意:如果应用本身有签名校验、设备绑定等反修改逻辑,修改包名后可能无法正常运行,该场景下优先选择方案1。
内容的提问来源于stack exchange,提问作者rumpel
相关产品推荐
相关产品推荐

