关于ABI的知识可以网上搜一下
在8.0之前,因为每次开机都要扫描APK,所以每次都要判断并设置ABI,这个过程比较花费时间,如果手机安装大量APK,势必会造成开机时间过慢
所以之前项目会对这一块做优化,将ABI信息写入一个xml文件中,首次开机或者安装删除APK就会更新这个文件,非首次开机就会直接读取里面的值
这次Android 8.0内部优化这一过程,而且比之前的方案更简单,下面来看看是怎么实现的:
之前在分析PKMS开机初始化的时候,知道最终会进入scanPackageDirtyLI方法内:
if ((scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) == 0) {
PackageSetting foundPs = mSettings.getPackageLPr(pkg.packageName);
if (foundPs != null) {
primaryCpuAbiFromSettings = foundPs.primaryCpuAbiString;
secondaryCpuAbiFromSettings = foundPs.secondaryCpuAbiString;
}
}
可以看到,这部分逻辑是,如果不是第一次开机或者升级,就从mSettings中读取PackageSetting类型的值,再将其中存储的关于ABI的值保存到临时变量中
再往下看
if ((scanFlags & SCAN_NEW_INSTALL) == 0) {
if ((scanFlags & SCAN_FIRST_BOOT_OR_UPGRADE) != 0) {
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "derivePackageAbi");
final boolean extractNativeLibs = !pkg.isLibrary();
derivePackageAbi(pkg, scanFile, cpuAbiO