VirtualApp原理解析(3)--安装双开应用流程

VirtualApp原理解析(3)–安装双开应用流程

双开应用安装在后天服务进程中进行,主要是解析apk文件信息,获取存储Activity、Service、广播等组建信息并保存。

以下是主要流程图:

在ListActivity中选择需要安装的目标应用后,后回到HomeActivity在onActivityResult()中接受需要安装的应用的信息AppInfoLite。安装流程是从此处开始的。

1.直接调用到HomePresenterImpl.addApp(AppInfoLite)方法执行安装逻辑。在addApp方法中:

  • 首先通过VirtualCore调用VAppMS.getInstalledAppInfo()检查该包名对应的应用是否执行官安装操作,即是否存在对应的数据结构InstalledAppInfo。根据该数据结构是否为null判断是否已经安装过。

  • 假设首次安装执行到AppRepository.addVirtualApp()该函数内部跨进程调用到后台服务进程中的VAppMS.installPackage()真正执行安装的地方就在此处。

2.在VAppMS.installPackage()执行安装逻辑:

  • 首先调用PackageParserEx.parsePackage()传入apk路径,该方法内部会反射获取PackageParser对象并解析对应apk获取该应用的组件信息并保存到VPackage中。

  • 从PackageCacheManager中的缓存中获取对应包名的VPackage数据结构,凡是安装成功的应用这里都会保存。通过获取的VPackage中的PackageSetting变量是否为null判断该应用是否已经安装过。如果安装过需要判断是否需要更新操作。这里涉及到应用升级逻辑。

  • 为该应用新建一个文件夹。如果是一个更新操作删除对应应用目录。

  • 接下来判断是否依赖系统的条件,如果不依赖与系统需要将目标apk拷贝到VirtualApp中为应用新建的文件夹下。同时需要设置下该文件夹权限。

  • 接着新建一个PackageSetting数据结构,将上述属性如:是否依赖系统、是否是art模式、目标apk所在路径、以及自己定义的一个uid。这个uid纯粹是自己定义为了区分该应该是第几次双开使用。因为VirtualApp支持同一应用多次安装成功多个应用同时的双开,这里uid就是为了区分这种情况。还有需要保存一个安装时间更新时间等。

  • 调用PackageParserEx.savePackageCache()将VPackage持久化保存到配置文件中。

  • 最后调用PackageCacheManager.put()函数,这里由一些关键步骤:

    • 首先调用PackageParserEx.initApplicationInfoBase(ps, pkg);该函数是将VPackage中的ApplicationInfo数据结构对应的应用文件目录、dataDir等属性修改为PackageSetting中的属性。

    • 接着保存一份VPackage到PackageCacheManager中缓存下次判断使用。同时将PackageSetting保存到VPackage的mExtras字段中。

    • 最后调用到VPMS.analyzePackageLocked()该函数内部会将传入的VPackage中的四大组件信息遍历之后保存到VPMS中对应的ActivityIntentResolver…一系列数据结构中。

  • 执行完以上之后调用BroadcastSystem.get().startApp(pkg)处理目标应用中的静态广播,将该该广播先注册到VirtualApp中,当收到广播后先到VirtualApp中,根据广播类型及其他条件确定是否需要分发给双开应用中去处理。

  • 最后如果有需要通知接口应用安装成功。返回安装结果。

3.安装结束需要获取安装后的信息及通知UI安装结果。

  • 首先调用PackageAppDataStorage.get().acquire()获取一个PackageAppData,这个东西其实就是之前安装信息的分装。

  • 根据PackageAppData判断是否是已经安装过的应用及多版本模式双开。

  • 如果第一次安装通知UI安装,调用handleOptApp()函数。该函数中调用preOpt获取安装的信息,如果该应用不是在art模式下运行执行dex文件优化。最后在一次更新UI。

以上就是双开应用安装步骤,简单总结如下:

  • 安装主要流程是在后台服务进程中的VAppMS中进行。

  • 安装过程主要是反射调用系统API解析传入apk获取该应用组件信息并保存。

  • 安装成功后同时将组件信息保存到VPMS中。

  • 安装后续工作优化dex文件及通知UI展示。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值