Android 5.0之前,一个APK代表一个应用。在Split APKs问世之后,一个应用可能对应多个APKs。所有Split APKs拥有相同包名和签名。
Android提供两种方式安装Split APKs。
- PackageInstaller.
这里我们重点介绍第二种安装方式,Android 5.0提供PackageInstaller用于安装Base APK和Split APKs。
当第三方应用通过PackageInstaller在应用运行期安装Split APKs时,系统会启动安装器界面供用户选择是否安装此次更新。
在用户选择后,应用将会被系统“杀死”。当应用再次启动之后,Split APKs就会生效。
系统应用可以静默安装Split APKs,且当Split APKs安装完成后,可以决定是否“杀死“应用进程。
SessionParams是PackageInstaller内部类,setDontKillApp
可决定当APK安装完成后是否杀死应用进程。setDontKillApp
属于系统Api,因此第三方应用无法调用。
应用进程所使用到的ClassLoader和Resources均在中创建。
通过Android 9.0 LoadedAPK
源码片段,我们一起了解下Split APKs加载过程。
ClassLoader创建。
如果
addedPaths
不为空,则更新PathClassLoader实例。
该方法指明,应用进程是可以动态加载Split APKs代码。
Resources创建。
通过getResources
方法代码片段,可知Split APKs的资源路径作为创建参数。
关于更多Split APKs加载原理细节,请阅读相关Android源码。