gradle 产出apk文件的全过程
**预编译(Pre-Compilation)** :在编译 APK 的过程中,会进行预编译阶段。这个阶段主要包括资源处理、代码转换和预处理等操作。例如,资源处理包括将资源文件编译成二进制格式;代码转换可以将 Kotlin 或 Java 代码编译成字节码;预处理阶段可能涉及资源合并、代码生成(注解生成代码)等。
当我给 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 文件。
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)