ParsePackage():
public Package parsePackage(File packageFile, int flags, boolean useCaches)
throws PackageParserException {
Package parsed = useCaches ? getCachedResult(packageFile, flags) : null;
if (packageFile.isDirectory()) {
parsed = parseClusterPackage(packageFile, flags);
} else {
parsed = parseMonolithicPackage(packageFile, flags);
}
return parsed;
}
在5.0后引入了SplitAPK机制,APK有两种分类:
- Single APK:完整的APK安装文件
- Multiple APK:在一个目录中存放了多个被拆分的apk;一个baseAPK和多个splitAPK
在ParsePackage()
中首先判断是否是Split APK,如果目录是一个文件夹说明是拆分的apk,调用parseClusterPackage()
:
parseClusterPackage():
private Package parseClusterPackage(File packageDir, int flags) throws PackageParserException {
// 分析 1
final Package pkg = parseBaseApk(baseApk, assets, flags);
if (pkg == null) {
throw new PackageParserException(INSTALL_PARSE_FAILED_NOT_APK,
"Failed to parse base APK: " + baseApk);
}
if (!ArrayUtils.isEmpty(lite.splitNames)) {
final int num = lite.splitNames.length;
pkg.splitNames = lite.splitNames;
pkg.splitCodePaths = lite.splitCodePaths;
pkg.splitRevisionCodes = lite.splitRevisionCodes;
pkg.splitFlags =