原标题:APK是如何被解析的?
前言
在本系列的前面文章中,我介绍了PackageInstaller的初始化和安装APK过程、PMS处理APK的安装和PMS的创建过程,这些文章中经常会涉及到一个类,那就是PackageParser,它用来在APK的安装过程中解析APK,那么APK是如何被解析的呢?这篇文章会给你答案。
1.引入PackageParser
Android世界中有很多包,比如应用程序的APK,Android运行环境的JAR包(比如framework.jar)和组成Android系统的各种动态库so等等,由于包的种类和数量繁多,就需要进行包管理,但是包管理需要在内存中进行,而这些包都是以静态文件的形式存在的,就需要一个工具类将这些包转换为内存中的数据结构,这个工具就是包解析器PackageParser。
在Android PMS处理APK的安装这篇文章中,我们知道安装APK时需要调用PMS的installPackageLI方法:
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
privatevoidinstallPackageLI(InstallArgs args, PackageInstalledInfo res){
...
PackageParser pp = newPackageParser(); //1
pp.setSeparateProcesses(mSeparateProcesses);
pp.setDisplayMetrics(mMetrics);
pp.setCallback(mPackageParserCallback);
Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "parsePackage");
finalPackageParser.Package pkg;
try{
pkg = pp.parsePackage(tmpPackageFile, parseFlags); //2
}
...
}
可以看到安装APK时,需要先在注释1处创建PackageParser,然后在注释2处调用PackageParser的parsePackage方法来解析APK。
2.PackageParser解析APK
Android5.0引入了Split APK机制,这是为了解决65536上限以及APK安装包越来越大等问题。Split APK机制可以将一个APK,拆分成多个独立APK。
在引入了Split APK机制后,APK有两种分类:
Single APK:安装文件为一个完整的APK,即base APK。Android称其为Monolithic。
Mutiple APK:安装文件在一个文件目录中,其内部有多个被拆分的APK,这些APK由一个 base APK和一个或多个split APK组成。Android称其为Cluster。
了解了APK,我们接着学习PackageParser解析APK,查看PackageParser的parsePackage方法:
frameworks/base/core/java/android/content/pm/PackageParser.java
publicPackage parsePackage(File packageFile, intflags, booleanuseCaches)
throwsPackageParserException {
Package parsed = useCaches ? getCachedResult(packageFile, flags) : null;
if(parsed != null) {
returnparsed;
}
if(packageFile.isDirectory()) { //1
parsed = parseClusterPackage(packageFile, flags);
} else{
parsed = parseMonolithicPackage(packageFile, flags);
}
cacheResult(packageFile, flags, parsed);
returnparsed;
}
注释1处,如果要解析的packageFile是一个目录,说明是Mutiple APK,就需要调用parseClusterPackage方法来解析,如果是Single APK则调用parseMonolithicPackage方法来解析。这里以复杂的parseClusterPackage方法为例,了解了这个方法,parseMonolithicPackage方法自然也看的懂。