gradle 产出apk文件的全过程

903 阅读5分钟

当我给 build.gradle中添加了渠道支持之后,如果我想要输出flavor1渠道的release包,

flavorDimensions "channel"
​
productFlavors {
    flavor1 {
        dimension "channel"
        // 配置其他自定义属性
    }
​
    flavor2 {
        dimension "channel"
        // 配置其他自定义属性
    }
​
    // 添加更多的渠道配置
}

那么我会执行命令:gradlew assembleFlavor1Release, Run窗口显示如下

> Task :app:preFlavor1ReleaseBuild UP-TO-DATE
> Task :app:compileFlavor1ReleaseAidl NO-SOURCE
> Task :app:generateFlavor1ReleaseBuildConfig UP-TO-DATE
> Task :app:compileFlavor1ReleaseRenderscript NO-SOURCE
> Task :app:mainApkListPersistenceFlavor1Release
> Task :app:generateFlavor1ReleaseResValues UP-TO-DATE
> Task :app:generateFlavor1ReleaseResources UP-TO-DATE
> Task :app:mergeFlavor1ReleaseResources UP-TO-DATE
> Task :app:createFlavor1ReleaseCompatibleScreenManifests
> Task :app:extractDeepLinksFlavor1Release UP-TO-DATE
> Task :app:processFlavor1ReleaseManifest
> Task :app:processFlavor1ReleaseResources
> Task :app:compileFlavor1ReleaseKotlin UP-TO-DATE
> Task :app:javaPreCompileFlavor1Release UP-TO-DATE
> Task :app:compileFlavor1ReleaseJavaWithJavac UP-TO-DATE
> Task :app:compileFlavor1ReleaseSources UP-TO-DATE
> Task :app:prepareLintJar UP-TO-DATE
> Task :app:lintVitalFlavor1Release
> Task :app:dexBuilderFlavor1Release UP-TO-DATE
> Task :app:checkFlavor1ReleaseDuplicateClasses UP-TO-DATE
> Task :app:mergeExtDexFlavor1Release UP-TO-DATE
> Task :app:mergeDexFlavor1Release UP-TO-DATE
> Task :app:mergeFlavor1ReleaseShaders UP-TO-DATE
> Task :app:compileFlavor1ReleaseShaders UP-TO-DATE
> Task :app:generateFlavor1ReleaseAssets UP-TO-DATE
> Task :app:mergeFlavor1ReleaseAssets UP-TO-DATE
> Task :app:processFlavor1ReleaseJavaRes NO-SOURCE
> Task :app:mergeFlavor1ReleaseJavaResource UP-TO-DATE
> Task :app:mergeFlavor1ReleaseJniLibFolders UP-TO-DATE
> Task :app:mergeFlavor1ReleaseNativeLibs UP-TO-DATE
> Task :app:stripFlavor1ReleaseDebugSymbols UP-TO-DATE
> Task :app:packageFlavor1Release
> Task :app:assembleFlavor1Release

从每个task的名称能够看出,生成apk的第一个步骤就是: preFlavor1ReleaseBuild , 预编译, 最后一个步骤是 assemble,也就是最终的组装apk的各部分并输出文件。

以下是 每一个步骤的详细说明:

根据你提供的 Gradle 输出日志,每个步骤:

步骤说明
1预编译
2AIDL文件编译
3BuildConfig文件生成
4编译renderScript文件
5将 Flavor1Release 的 APK 文件添加到 APK 清单列表中
6根据 Flavor1Release 的资源值生成相应的类文件
7根据 Flavor1Release 的资源文件生成资源索引
8将 Flavor1Release 的所有资源文件合并到一个单独的文件中
9创建 Flavor1Release 的兼容屏幕清单文件,用于支持不同的设备屏幕尺寸和密度
10从 Flavor1Release 的清单文件中提取深度链接信息,用于应用内部导航
11处理 Flavor1Release 的 AndroidManifest.xml 文件,解析和检查配置项并生成 APK 所需的清单文件
12处理 Flavor1Release 的资源文件,将资源文件编译为二进制格式并进行资源转换和优化处理
13此任务编译 Flavor1Release 的 Kotlin 源代码
14编译 Flavor1Release 的 Java 源代码
15将 Flavor1Release 的 Java 源代码编译成字节码
16编译 Flavor1Release 的所有源代码,包括 Java 和 Kotlin
17准备 Lint 工具的任务,此任务用于静态代码分析和错误检查
18执行 Flavor1Release 版本的 Lint
19在 Flavor1Release 构建过程中使用 DEX 构建器
20检查 Flavor1Release 构建过程中是否存在重复的类文件
21将 Flavor1Release 构建所需的外部 DEX 文件合并到一个单独的 DEX 文件中
22将 Flavor1Release 构建过程中生成的所有 DEX 文件合并到一个单独的 DEX 文件中
23将 Flavor1Release 构建过程中生成的所有 Shaders(着色器)文件合并到一个单独的文件中
24此任务编译 Flavor1Release 构建过程中的 Shaders 文件
25生成 Flavor1Release 构建过程所需的资源文件(如图片、音频等)
26将 Flavor1Release 构建过程中生成的所有资源文件合并到一个单独的文件夹中
27此任务处理 Flavor1Release 构建过程中的 Java 资源文件
28将 Flavor1Release 构建过程中生成的所有 Java 资源文件合并到一个单独的文件夹中
29将 Flavor1Release 构建过程中生成的所有 JNI 库文件合并到一个单独的文件夹中
30将 Flavor1Release 构建过程中生成的所有本地库文件合并到一个单独的文件夹中
31去除 Flavor1Release 构建过程中生成的调试符号表(debug symbols)
32将 Flavor1Release 构建过程中生成的所有文件打包为 APK 文件
33将 Flavor1Release 构建过程中生成的 APK 文件和其他相关文件组装成最终的 Flavor1Release 版本

有些步骤是同一个操作下的几个分步骤,如果总结一下就是如下简化版本:

  1. 预编译(Pre-Compilation) :在编译 APK 的过程中,会进行预编译阶段。这个阶段主要包括资源处理、代码转换和预处理等操作。例如,资源处理包括将资源文件编译成二进制格式;代码转换可以将 Kotlin 或 Java 代码编译成字节码;预处理阶段可能涉及资源合并、代码生成(注解生成代码)等。
  2. 编译(Compilation) :在这个阶段,会将项目中的源代码(Java、Kotlin等)编译成可执行的字节码文件。编译过程通常会检查源代码中的语法错误,并生成对应的类文件。
  3. 资源打包(Resource Packaging) :将预编译阶段处理的资源文件(包括图像、布局文件、字符串等)和编译阶段生成的字节码文件一起打包成 APK
  4. 输出(Output) :将多种文件打包放置到正确的位置(Java,kotlin生成class,而后变成的dex,本地库so等,)最后一步是生成最终的 APK 文件,包括给 APK 文件指定名称、目标路径,并将签名后的 APK 文件复制到目标路径。

上面的30多个步骤,总结起来就是这么4个。项目配置中 ,我没有添加签名文件以及二进制优化对齐,如果加上之后,在3-4之间还会有两个步骤:

  • 签名(Signing) :在发布应用之前,需要对 APK 进行签名以保证应用的完整性和安全性。签名过程涉及生成密钥库、创建签名证书和对 APK 进行签名等操作
  • 对齐(Alignment) :为了提升应用在设备上的加载速度和执行效率,需要对 APK 进行对齐操作。对齐会调整 APK 中的数据结构,以便在设备上更高效地读取。

这些任务组合在一起,构成了构建过程中的不同阶段,负责处理资源、编译代码、检查重复项、合并文件以及打包 APK 等操作。通过这些任务的有序执行,最终产出了 Flavor1Release 版本的 APK 文件。