开机应用扫描
PkMS构造方法-->scanDirTracedLI()-->scanDirLI{
1.遍历目录下的所有文件
2.获得ParallelPackageParser.ParseResult,parseResult.pkg
}
-->scanPackageChildLI--->addForInitLI{}-->
--->scanPackageOnlyLI{
1.pkgSetting相关变量赋值 Settings创建createNewSetting或者更新updatePackageSetting相关的值
2.needToDeriveAbi是否需要提取abi,第一次开机或者升级为true
3.scanFlags != SCAN_NEW_INSTALL(在installPackageLI中赋值) ,通过检测应用内部的so bit(derivePackageAbi),另外对应系统应用还可以检测是否有lib目录来确定primaryCpuAbi的值
4.isPlatformPackage系统包abi设为系统位数
5.更新PackageSetting pkgSetting,
}
PKMS.addForInitLI-->
//Settings.java 写入packages.xml
enableSystemPackageLPw--->addPackageLPw{mPackages.put}
mSettingsFilename packages.xml--->writeLPr{遍历PackageSetting mPackages}--->writePackageLPr{ serializer.attribute(null, "primaryCpuAbi", pkg.primaryCpuAbiString);}
///
应用安装
installPackageLI--->derivePackageAbi 根据应用so的位数来确认abi{setNativeLibraryPaths这个方法中getPrimaryInstructionSet读取PREFERRED_INSTRUCTION_SET(ro.product.cpu.abilist)的第一位64,}
///
scanPackageOnlyLI{
if (isSystemApp(pkg) && !pkg.isUpdatedSystemApp() &&pkg.applicationInfo.primaryCpuAbi == null) {
setBundledAppAbisAndRoots--->setBundledAppAbi 根据lib/lib64目录获取abi的位数{
final File rootDir = new File(codeFile, LIB_DIR_NAME);
///codeFile=/system/app/Bluetooth/
///LIB_DIR_NAME = "lib"
//rootDir=/system/app/Bluetooth/lib
///
final String isa = VMRuntime.getInstructionSet(Build.SUPPORTED_64_BIT_ABIS[0]);
has64BitLibs = (new File(rootDirdi, isa)).exists();
///AOSP
isa=x86_64 rootDir=/system/app/Bluetooth/lib 这个目录中存在对应的x86_64目录那么可以设置为64位 has64BitLibs=true
}
}
}
adjustCpuAbisForSharedUserLPw UID相同的应用,abi值为空的,遍历到不为空的,赋值
1.derivePackageAbi
2. setBundledAppAbisAndRoots
3.adjustCpuAbisForSharedUserLPw