现如今随着组件化, 插件化框架以及热修复,AOP编程等高级用法的新起,不得不驱使大家去了解更加底层的原理,上一篇文章笔者介绍了关于JVM字节码的理解,这篇文章笔者就来讲解下我们apk从编译到安装的过程。
首先来了解下我们apk的成员
apk文件组成1.AndroidManifest.xml:apk的配置文件,内部包含了应用的名称,权限声明,四大组件等信息的声明,如果说app是一本书,它就是这本书的封面
2.classes.dex:由源码编译后的的.class文件经过进一步转换成Android系统可识别的Dalvik Byte Code,包括第三方JAR或aar中的class文件
3.resources.arsc:资源索引表,使用的是一个二进制流的格式,记录R文件id和资源文件路径的一个映射表以及我们在res文件夹下放入一个资源文件,aapt就会自动在R文件中生成对应的资源文件id,而R文件只能保证编译不报错,实际运行时还是需要依赖resources.arsc中的映射关系,通过R文件id找到实际资源文件路径。
4.res 目录:存放未编译的资源文件
5.asserts:也是资源文件夹,和res的区别:res文件会在R文件中生成索引,运行时使用索引获取资源文件,而asserts目录下的文件不会在R文件中生成索引,使用AssetManager访问文件
6.libs 目录:存储so动态库
7.META-INF 目录:存储签名和校验信息,确保程序的完整性。Apk打包时会使用签名文件对apk进行签名校验,并将结果记录到META-INF 目录下,Apk安装的时候设备也会对应用进行一次校验,并和META-INF 目录下的校验信息对比,防止apk在出包后被篡改
apk打包编译过程放一张官方apk编译过程图:
旧版本打包编译过程更详细的描述了具体过程