Gradle打包流程
Gradle打包流程
一、Gradle基础概念
1、是什么
自动化构建工具,通过组织一系列task来最终完成自动化构建的。
2、gradle使用groovy或者kotlin编写。
groovy是DSL。那么什么是DSL?DSL也就是Domain Specific Language的简称,也就是领域特定语言,是为了解决某一类任务专门设计的计算机语言。DSL使用简单,定义比较简洁。
3、无论是基于groovy还是kotlin编写,均是基于jvm的语言。
因此本质上都是面对对象的,面向对象的特点是一切皆为对象,所以,在gradle里,.gradle脚本的本质就是类的定义,一些配置项的本质都是方法调用,参数是后面的{}闭包。比如build.gradle对应Project类,buildScript对应Project.buildScript方法。
二、打包流程
三部曲:初始化、配置、执行
1. 初始化(Initialization)
settings.gradle
解析
确定参与构建的模块(Module),构建多模块工程依赖树。
2. 配置(Configuration)
- 解析
build.gradle
文件- 根项目的
build.gradle
:定义全局配置(如仓库地址、依赖版本)。 - 模块的
build.gradle
:配置Android插件、构建类型(Build Types)、依赖项等。
- 根项目的
- 创建Task依赖图
Gradle根据配置生成所有Task及其依赖关系(不执行Task)。
3. 执行(Execution)
Gradle按依赖顺序执行Task,核心流程如下:
3.1 资源处理
- 资源合并与编译
- 合并所有资源(
src/main/res
、Flavor资源、Build Type资源)。 - 编译资源为二进制格式(
.ap_
文件),生成R.java
/R.kt
文件。
- 合并所有资源(
3.2 代码编译
- Java/Kotlin 编译
- 编译Java/Kotlin源码(包括生成的
R.java
和BuildConfig.java
)。 - 输出:
.class
文件
- 编译Java/Kotlin源码(包括生成的
3.3 字节码处理
- Transform API 阶段
自定义Transform(如字节码插桩)在此介入。 - Dex/D8转换
dexBuilder
Task(AGP 3.0+):
使用D8编译器将.class
文件转换为Dex格式(Dalvik/ART可执行文件)。- 输出:
*.dex
文件(或增量处理的.jar
)。
3.4 打包APK
- 资源、代码、清单合并
package[BuildVariant]
Task:- 合并所有资源、清单文件(Manifest)。
- 将Dex文件、编译后的资源、原生库(
.so
)、Assets等打包到未签名的APK中。
3.5 APK签名
sign[BuildVariant]
Task
使用调试密钥或发布密钥对APK签名:- 调试模式:自动使用
debug.keystore
。 - 发布模式:需配置签名信息(在
build.gradle
中定义signingConfigs
)。
- 调试模式:自动使用
3.6 优化与对齐(Release构建)
- Zipalign优化
zipalign
Task:
对齐APK中的资源文件到4字节边界,提升运行时内存访问效率。
- R8/ProGuard混淆(可选)
- 在Release构建中启用:
压缩代码、移除无用资源、混淆类/方法名(生成mapping.txt
)。
- 在Release构建中启用:
4. 输出产物
- 生成APK文件:位于
app/build/outputs/apk/[variant]/
。 - 可选生成AAB(Android App Bundle):用于上传Google Play。