当我给 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 | 预编译 |
2 | AIDL文件编译 |
3 | BuildConfig文件生成 |
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 版本 |
有些步骤是同一个操作下的几个分步骤,如果总结一下就是如下简化版本:
- 预编译(Pre-Compilation) :在编译 APK 的过程中,会进行预编译阶段。这个阶段主要包括资源处理、代码转换和预处理等操作。例如,资源处理包括将资源文件编译成二进制格式;代码转换可以将 Kotlin 或 Java 代码编译成字节码;预处理阶段可能涉及资源合并、代码生成(注解生成代码)等。
- 编译(Compilation) :在这个阶段,会将项目中的源代码(Java、Kotlin等)编译成可执行的字节码文件。编译过程通常会检查源代码中的语法错误,并生成对应的类文件。
- 资源打包(Resource Packaging) :将预编译阶段处理的资源文件(包括图像、布局文件、字符串等)和编译阶段生成的字节码文件一起打包成 APK
- 输出(Output) :将多种文件打包放置到正确的位置(Java,kotlin生成class,而后变成的dex,本地库so等,)最后一步是生成最终的 APK 文件,包括给 APK 文件指定名称、目标路径,并将签名后的 APK 文件复制到目标路径。
上面的30多个步骤,总结起来就是这么4个。项目配置中 ,我没有添加签名文件以及二进制优化对齐,如果加上之后,在3-4之间还会有两个步骤:
- 签名(Signing) :在发布应用之前,需要对 APK 进行签名以保证应用的完整性和安全性。签名过程涉及生成密钥库、创建签名证书和对 APK 进行签名等操作
- 对齐(Alignment) :为了提升应用在设备上的加载速度和执行效率,需要对 APK 进行对齐操作。对齐会调整 APK 中的数据结构,以便在设备上更高效地读取。
这些任务组合在一起,构成了构建过程中的不同阶段,负责处理资源、编译代码、检查重复项、合并文件以及打包 APK 等操作。通过这些任务的有序执行,最终产出了 Flavor1Release 版本的 APK 文件。
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END