Android编译打包流程
Android的工程代码中间都经历了什么变成了最后能在手机上运行的APK? 这个过程我们称之为编译打包
官方介绍的大概流程是:编译—>dex—>打包—>签名和对齐,那这些流程具体都做了什么呢?下面我们来研究一下
我们的工程中都有哪些资源:res(res目录下的layout drawable等) 、 JavaResource(.java文件)、 AIDL 、asset 、三方库 、AndroidManifest.xml
下面我们看下编译打包阶段对每一种资源的处理:
- res资源是通过 Android资源打包工具aapt生成 :res文件(layout color等变成二进制文件 图片和raw的保持原样)、R.java 和 resource.arsc。resource.arsc这个文件记录了应用程序所有的资源目录信息,包括每个资源的名称 类型 值 id 及所配置(手机配置)的位置信息,可以把它想象成一个索引表,给定id和配置可以通过它快速的找到最匹配的资源。
- AIDL,Android接口定义语言会生成对应的java接口文件,不懂的可以自行搜索AIDL学习。
- JavaResource(R.java aidl生成的.java 原来的.java文件)会经过java编译工具 javac生成Java虚拟机能识别的.class文件
- 三方库.class文件 和 步骤3 生成的.class文件 经过dex工具生成,生成多个.dex文件(多个是要看有没有分包),dex是Davik VM能识别的文件。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统,dex工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等
- asset、Manifest 和 dex 经过apkBuilder生成,未签名的apk文件
- apk文件通过JarSigner签名变成Sign.apk
- Signapk通过ziplign进行对齐生成最后的APK,ziplign的主要工作是将apk包进行对齐处理,使apk包中的所有资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问Apk文件时的速度会更快
下面是完整的流程图
参考文档:
https://www.jianshu.com/p/019c735050e0
https://www.cnblogs.com/xunbu7/p/7345912.html