java apk解析_APK是如何被解析的?

原标题:APK是如何被解析的?前言在本系列的前面文章中,我介绍了PackageInstaller的初始化和安装APK过程、PMS处理APK的安装和PMS的创建过程,这些文章中经常会涉及到一个类,那就是PackageParser,它用来在APK的安装过程中解析APK,那么APK是如何被解析的呢?这篇文章会给你答案。1.引入PackageParserAndroid世界中有很多包,比如应用程序的APK,...
摘要由CSDN通过智能技术生成

原标题: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方法自然也看的懂。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值