简单的编译流程图
下图取自Google官方的Build System Overview ,这个Android APK编译流程图有很久了,估计很多人都比较熟悉,可以好好的体会一下这个编译流程,然后对比下面一种基于Gradle编译的新的编译流程图。
详细的编译流程图
下图取自Google官方New Build System的Build WorkFlow,可以看到新的编译流程图比较详细,但是大体上和以前的编译流程没有区别。
App编译流程
一个Android应用从开始编译到打包大致上会经历三个步骤:编译前检查--> 编译(资源文件和源码)-->打包签名
我们以最熟悉的Android Studio开发应用为例,首先,我们把Gradle构建项目从本文中剖离开,不讨论具体的Gradle构建是怎么回事,只关注于代码是如何通过一系列的Android编译工具最终生成APK的。
编译步骤如下:
- 首先在编译阶段,会对资源文件文件进行检查,包括AndroidManifest.xml 、res目录下的所有文件(文件名是否合理),在检查通过后,对资源文件进行处理,一次编译生成resources.arsc 和 R.java文件,在完成资源编译后,会针对res目录下的xml文件和AndroidManifest.xml分别进行编译,这样处理过的xml文件就被简单的“加密”(如果你解压一个apk,会发现所有的xml布局文件都是乱码),最后处理后的res&AndroidManifest.xml&resources.arsc会打包压缩成resources.ap_文件,在AndroidStudio的项目下
/app/build/intermediates/res
目录下可以看到编译打包后生成的资源打包文件。如果项目中使用了NDK来编译native代码,则也会在这个阶段编译并生成.so库文件。在apkbuilder的时候作为三方库文件打包进应用。 - 处理AIDL文件,在编译阶段会将.aidl的文件编译生成相应的java代码供程序调用。
- 编译工程源码,生成相应的class文件,位于项目
/app/build/intermediates/classes
目录下。 - 在class文件生成后,如果使用了混淆,则会调用proguard.jar文件对class文件和资源文件进行混淆优化处理,同时生成混淆的mapping文件,位于
/app/
,如果没有使用混淆,则直接转换所有的class文件生成classes.dex文件。 - 打包生成APK文件。