本文从宏观视角来看看APK文件结构及其设计思想,借助一个简单的“Hello Android”为例说明java
An APK file contains all of a program’s code (such as .dex file), resources, assets, certificates, and manifest file.android
APK文件自己是个压缩文件,咱们能够经过一个简单的Hello Android示例和一个复杂的应用,对比其对应的APK文件。 首先新建一个简单的Hello Android项目,build出一个APK文件后拖到AS中利用自带的apkanalyzer打开,基本组成如图: 微信
那这些文件究竟是怎么生成的,接下来看看一个APK文件的构建流程。框架
Android Studio默认采用gradle组织完成打包过程,对开发者来讲简单的执行相关的task便可,这种透明的打包过程也让咱们忽略了不少细节,这里咱们以上述APK文件结构做为对照,来一窥源码结构变成最终的APK文件的过程。ide
以Hello Android为例,对比源码中的AndroidManifest.xml 与 APK中的AndroidManifest.xml 能够明显看出 工具
对比源码和打包后res目录的变化,也会发现res中的drawable中的图片等资源没有发生明显变化(其实会部分压缩),layout/下的xml文件也发生了相似AndroidManifest.xml的字符串替换和编译,变成了二进制文件,而values/不见了。对res/的处理也发生在aapt编译资源的过程当中,对其中的xml文件进行编译和字符串裁剪,部分xml资源会被编译进resources.arsc。布局
resources.arsc 也是个二进制文件,是aapt打包资源过程当中的产物,同时伴随着上述资源文件的编译和压缩,其中res/value其实就编译进了resources.arsc, 其余的资源文件的id和路径对应关系也写进了这个文件,便于运行时访问。gradle
对资源打包和访问不太熟悉的能够参考:优化
目录中的文件未发生变化
无变化
dex文件是Dalvik 和 ART 可执行格式。相较于JVM,dex将多个class文件打包到了一块儿,所以从Java文件到dex,须要经历java--->class-->dex的过程;
相较于class文件,dx工具在生成dex文件的过程当中,会对字符常量池和一些冗余信息会进行压缩,结构上比class文件也更加紧凑。
经过apkbuilder工具,将aapt处理后的相关资源文件和利用dx处理生成的Classes.dex打包生成APK文件,apkbuilder工具也位于 sdk/build-tools/
借助zipalign工具,对APK文件进行对齐处理:
zipalign 是一种归档对齐工具,可对 Android 应用文件进行重要的优化。其目的是要确保全部未压缩数据的开头均相对于文件开头部分执行特定的对齐。具体来讲,它会使 APK 中的全部未压缩数据(例如图片或原始文件)在 4 字节边界上对齐。这样一来,便可使用 mmap() 直接访问全部部分,即便其中包含具备对齐限制的二进制数据也不要紧。这样作的好处是能够减小运行应用时消耗的 RAM 容量。
经过apksigner工具,对生成的APK文件进行签名;
以上,咱们就获得了一个包含 代码 + 资源 + 签名信息的可独立安装运行的APK文件。
以上用到的相关脚本及工具均位于 sdk/build-tools/
咱们首先分析了一个基本的APK文件的组成部分,以后拆解了每个组成文件的生成过程及其相关脚本。若是你对aapt、dx、apksigner的具体工做流程感兴趣,能够查找并阅读其源码。再来看官方打包流程图,相信你会更加清晰!