在《Android软件安全与逆向分析》书中看到android apk的打包过程,觉得比较有意思,因此根据书中内容整理了本篇文章。
1)将应用源文件打包生成R.java文件,打包工具为aapt(位置为..\sdk\build-tools\android-4.4.2)。检查AndroidManifest.xml的合法性,然后检查res目录下的资源子目录内资源文件名的合法性、向资源表table添加条目,编译res和asert下的资源生成resource.arsc,编译生成R.java文件。并且对res目录下的xml文件编译。最后将所有的资源和resource.arsc文件,以及编译过的xml文件打包压缩为resources.ap_文件。
2)处理aidl(android interface definition language, android接口描述语言)文件生成java文件。
3)编译工程源代码,生成class文件。调用javac编译src下的java源文件,生成的class文件位于bin\class下。
4)将class文件转换,生成classes.dex文件,转换工具为dx。即将字节码转换为Dalvik字节码,压缩常量池、消除冗余信息。
5)通过apkbuilder打包生成apk文件。首先以resources.arsc文件为基础生成apk,接着添加res和assert下的资源,然后写入依赖库。
6)对apk文件进行签名,签名之后才能在android设备上安装。签名方式有两种:使用debug.keystore在调试程序时进行签名;还有打包发布时的签名,需要提供签名文件。对于第二种情况打包发布时的签名,可以使用JDK提供的jardesigner工具签名,也可以使用signapk进行签名。
7)对apk包进行对齐处理,工具为zipalign。对齐处理即使得所有资源文件距离文件起始偏移为4字节的整数倍,这样通过内存映射访问apk文件时处理速度更快。
本文内容均来源于书籍:《Android软件安全与逆向分析》
欢迎访问我的博客:www.dzwanli.com.cn