APK打包流程
apk其实就是一个压缩包,里面有lib,META-INF,classes.dex,res,resources.arsc等文件,我们对一个apk文件进行解压,可以发现里面其实有许多文件:
每个文件对应的描述如下:
- res文件夹:包含了工程中res目录下除values以外的所有内容,一般包括各种layout文件,drawable。其中,layout文件内容是以二进制xml的方式进行保存的,而所有的drawable图像资源都是未经压缩过的原始文件。
- classes.dex文件:Android系统Dalvik虚拟机执行的
classes.dex
文件,在apk文件中,classes.dex
文件可能会有多个。 - resources.arsc:是所有的资源id的数据集合,记录了所有的应用程序资源目录的信息,该文件同样是二进制格式的文件。
- lib:工程中包含的.jar文件。
- META-INF:app签名文件,存放签名证书
- AndroidManifest.xml:合并后的最终的AndroidManifest.xml文件
- assets:混合开发中一般html5和javascript以及相关资源可以存放在Assets文件夹内
来看一张官方给出的apk的打包流程图:
对图中的编译打包流程进行一个总结:
1、打包资源文件,生成R.java文件
打包资源的工具:
aapt
,The Android Asset Packaing Tool生成文件:
R.java
、resource.arsc
在这个过程中,项目中的AndroidManifest.xml、XML布局文件、res文件夹里的资源文件、assets文件夹里的文件都会被打包,然后生成相应的
R.java
文件。res和assets文件夹里的文件会原封不动的打包进apk(生成resources.arsc),而AndroidManifest、布局文件等xml文件会被aapt编译成二进制文件。
2、处理aidl文件,生成相应的java文件
处理aidl的工具:
aidl
,Android Interface Definition Language生成文件:
.java文件
aidl工具解析接口定义文件然后生成相应的Java代码接口供程序调用。如果在项目没有使用到aidl文件,则可以跳过这一步。
3、编译项目源代码,生成class文件
编译java代码的工具:
java编译器(javac)
生成文件:
.class文件
将项目src目录下的所有源码文件、项目中的库文件(.jar文件)、以及上两个步骤中生成的R.java文件和.java文件一起编译成
.class
文件。
4、转换所有的class文件(包括第三方的class文件),生成classes.dex文件
工具:dx工具
生成文件:
.dex文件
所有
.class
文件都会被转化成可供Android系统Dalvik虚拟机执行的classes.dex
文件。
5、将已编译的资源文件以及其他资源文件以及dex文件,一起打包生成APK文件
工具:
apkbuilder
生成文件:
未签名的.apk文件
所有没有编译的资源,如res、assets目录下的资源(该类文件是一些原始文件,APP打包时并不会对其进行编译,而是直接打包到APP中,对于这一类资源文件的访问,应用层代码需要通过文件名对其进行访问);编译过的资源和
.dex
文件都会被apkbuilder工具打包到最终的.apk
文件中。
6、对APK文件进行签名,得到签名后的apk文件
工具:
Jarsigner
生成文件:
签名后的apk文件
一旦APK文件生成,它必须被签名才能被安装在设备上。在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android Studio中直接run以后跑在手机上的就是使用的debug.keystore,另一种就是用于发布正式版本的keystore。
7、对签名后的APK文件进行对齐处理
工具:
zipalign
生成文件:
对齐后的apk文件
如果发布的apk是正式版的话,就必须对APK进行对齐处理,对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用。