Android程序即APK文件。APK文件实际上是一个zip压缩包。
APK打包流程,可分为7步。
第一步:
打包资源文件生成R.java文件,主要使用工具aapt。
- 调用aapt源码目录下Resource.cpp中的buildResources(),首先检查AndroidManifest.xml的合法性。
- makeFileResource()函数处理res目录下的资源,然后调用compileResourceFile()函数编译res与asserts目录下的资源文件。
- 调用parseAndAddEntry()函数生成R.java文件。
- 调用compileXmlFile()函数对xml文件进行编译,相当于加密处理。
- 最后将所有资源文件和编译生成的resources.arsc文件和AndroidManifest.xml文件打包压缩成resources.ap_文件
第二步:
处理aidl文件,生成相应的java文件。(aidl为 android interface definition language)Android接口描述语言。
第三步:
编译工程源代码,生成相应的class文件。
- 调用javac编译java源文件生成class文件。
- NDK的话需要编译native代码。
第四步:
转换所有的class文件,生成classes.dex文件。主要使用dx工具。
第五步:
打包生成APK文件。打包的工具为apkbuilder。
第六步:
对APK文件进行签名。
第七步:
对签名后的APK文件进行对齐处理。
DEX文件
dex文件由7部分组成。
1.dex header 指定dex文件的一些属性。还有其他6部分数据结构的物理偏移。
2.string_ids到class_def结构可以理解为“索引结构区”
3.数据存放在data区,link_data为静态链接数据区。