- Split APKs的Application初始化。
- Split APKs的Content Provider动态加载。
- 通过Tinker patch完成split APKs热更新。在此,我们首先介绍Qigsaw多进程功能。以下图场景为例。
依据Qigsaw安装、加载split APKs原则,当游戏APK安装完成后,就会在主进程完成加载。在游戏APK中有两个Activity,他们所处进程不同。当启动时,页面正常启动。但当启动GameActivity02
,您的App会出现崩溃。原因是GameActivity02
运行在:game
进程,游戏APK仅在主进程加载,并未在进程加载,因此系统会抛出ClassNotFoundException异常。
为解决这类问题,Qigsaw提供了如下解决方案。
- 在进程启动之初即
Applicatin#attachBaseContext
调用时,加载所有已安装splits。
Hook PathClassLoader具体做了如下事情。
- 当出现ClassNotFoundException时,判断该类是否为splits四大组件。
- 当异常类为splits四大组件时,加载所有已安装未加载split APKs。
国内很多App都接入Tinker用于修复线上bug,爱奇艺同样也接入。Qigsaw本身提供热更新能力,但在实际开发过程中发现,Qigsaw能借助Tinker Patch热更新split APKs,提升开发效率。
Qigsaw在打包过程中会生成关于包含split信息的.json
文件,该文件存储在base APK的assets目录下。其命名规则为。
json文件记录的内容如下。
该文件记录着splits版本号以及下载地址,如果Tinker开启资源修复,我们就可以通过tinker patch更新该json文件,以此达到热更新splits目的。