Android打包流程
-
打包资源文件,生成R.java文件
这个过程使用了android-sdk/platform-tools目录下aapt工具将资源文件打包,这个过程中项目中的AndroidManifest.xml文件和布局文件xml都会编译生成相应的R.java,同时还有编译生成成resources.arsc和uncompiled res文件(二进制文件 & 非二进制文件)
非二进制文件(eg:res/raw、res/pic)保持原样
assets资源文件内容保持原样
-
处理aidl文件,生成相应的java文件
这个过程使用了android-sdk/platform-tools目录下aidl工具解析接口定义文件,然后生成相应的java接口,供程序调用 如果项目中没有使用到aidl文件,那么这个过程可以跳过
-
编译项目源代码,生成.class文件
这一步调用了javac编译工程目录下所有的java源文件,包括前两个过程生成的java源文件,生成的class文件位于工程的bin\classes目录下,如果项目中需要使用NDK编译native代码的话,这一步需要使用NDK编译C/C++代码,当然,编译C/C++代码的步骤可以提前到第一步或第二部
-
转换所有的class文件,生成classes.dex文件
这一步使用了位于android-sdk/platform-tools下的dx工具,dx工具可以生成供Android系统虚拟机的执行文件classes.dex
dx工具主要工作就是将java字节码转换成Dalvik字节码,压缩常亮池以及消除冗余信息(包括第三方的lib和.class文件)
-
打包生成apk文件
这一步使用了android-sdk/tools目录下的打包工具apkbuilder把所有没有编译过的资源文件、编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中
-
对apk进行签名
apk文件只有被签名才能被安装在设备上。
签名文件(keystore)有2种
一种是用于调试的 debug.keystore,开发工具中Run以后在设备上运行的Apk就是debug.keystore签名 一种是用于发布正式版本的keystore
签名的方法有2种
用jdk中提供的jarsigner工具签名 使用android源码中提供的signapk工具,它的代码位于android系统源码build\tools\signapk目录下
-
对签名后的apk文件进行对齐处理
这一步会使用android-sdk\tools目录下zipalign,它的主要工作是将签名后的apk进行对齐处理,是apk所有资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时速度会更快
参考资料:
- https://blog.csdn.net/lazyer_dog/article/details/54581148
- https://blog.csdn.net/jason0539/article/details/44917745