花非花·关于编译需要了解什么

Android 基础编译流程

Android 工程的构建打包是一个复杂的流程,涉及工程源代码、资源文件、AIDL 文件以及工程所依赖的库文件的编译转换。

官方提供的构建流程图:

build_process

编译构建的4个步骤:源代码编译->代码合成->资源打包->签名和对齐。

  1. Java 编译器对工程的代码资源进行编译,代码资源包括 App 的源代码、apt 编译生成的 R 文件和 AIDL 文件生成的 Java 接口文件。通过 Java 编译器编译生成 *.class 文件。
  2. 通过 dex 工具,将 *.class 文件和项目依赖的第三方库文件生成虚拟机可执行的 .dex 文件,如果使用了 MultiDex,会产生多个 dex 文件,包含编译后的所有 .class 文件,即自身的 class文件和依赖库的 .class 文件。
  3. apkbuilder 工具将 .dex 文件、apt 编译后的资源文件、依赖中的第三方库内的资源文件打包生成签名对齐的 apk 文件。
  4. 使用 Jarsigner 和 Zipalign 对文件进行签名和对齐,最终生成 apk 文件。

通过 Gradle工具可以看到每个运行的 Task 的情况,还可以看到 Gradle 编译的流程,详细地显示出每个任务的 Task 耗时,如图:

Gradle 编译流程

以下为执行 ./gradlew assembleDebug 的 Task 输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
:app:preBuild // 开始预编译
:app:preDebugBuild // 开始 Debug 版本预编译
:app:checkDebugManifest // 开始检查 AndroidManifest
:app:prepareDebugDependencies // 检查 Debug 版本依赖
:app:compileDebugAidl // 编译 Debug 版本的 AIDL 文件
:app:compileDebugRenderscript // 编译 Renderscript 文件
:app:generateDebugBuildConfig // 生成 BuildConfig 文件
:app:generateDebugAssets // 生成 Assets 文件到文件夹
:app:mergeDebugAssets // 合并 Assets 文件
:app:generateDebugResValues // 生成 res value 文件
:app:generateDebugResources // 生成 resource 文件
:app:mergeDebugResources // 合并 resource 文件
:app:processDebugManifest // 处理 AndroidManifest 文件
:app:processDebugResources // 处理 resource 文件
:app:generateDebugSources // 合成资源文件
:app:compileDebugJavaWithJavac // 使用 Javac 编译 Java 文件
:app:compileDebugNdk // NDK 编译
:app:compileDebugSources // 编译资源文件
:app:transformClassesWithDexForDebug // 将 .class 文件转换成 .dex 文件
:app:mergeDebugJniLibFolders // 合并 JNI 文件夹
:app:transformNative_libsWithMergeJniLibsForDebug // 转换 JNI 文件
:app:processDebugJavaRes // 处理 Java 资源
:app:transformResourcesWithMergeJavaResForDebug // 转换 Java资源文件
:app:validateDebugSigning // 验证签名
:app:packageDebug // 打包
:app:assembleDebug // 签名

参考