1. 前言
前几篇文章,我们对Gradle
中的基本知识,包括Gradle
项目结构、Gradle Wrapper
、GradleUserHome
、Groovy
基础语法、Groovy
语法概念、Groovy
闭包等知识点,这篇文章我们接着来介绍Gradle
构建过程中的知识点。
2. Project : Gradle中构建过程的基本单位
在Gradle构建工具中,Project是一个核心概念,它代表了一个独立的构建单元,对应到项目结构中的一个模块或者子模块(每个build.gradle文件代表一个Project
)。
在Gradle的构建模型中,一个Project可以包含多个子Project,形成一个树状结构。根Project用于统筹管理所有的子Project,而每个子Project都对应一个输出,例如APK文件、aar文件或jar文件等。
一个build(构建过程)由一个或多个project组成。每个project可以有多个task。
3. Task : Gradle中最小的构建单元
Task字面翻译就是任务的意思,是Gradle中最小的构建单元,每个Task代表构建过程中的一项具体工作或操作,比如编译Java源代码、打包JAR文件、运行测试、生成文档等,每一个Task都属于一个Project。
你可以将Gradle构建过程想象成一系列相互依赖的任务集合,这些任务按照特定的顺序和条件执行,共同完成构建流程。
在Gradle脚本(通常是build.gradle或settings.gradle.kts等文件)中,通过task关键字或者tasks.create()方法来定义一个Task。定义时可以为任务指定名称、组(group)、描述(description)以及闭包(closure)或动作(action),闭包内包含任务实际执行的操作逻辑。
// 定义一个简单的Task并设置其组和描述
task helloTask (group: 'example', description: 'Prints a hello message') {
doLast {
println 'Hello from Gradle Task!'
}
}
在build.gradle中,一切无主的方法,都回去Project上查找。
如果你好奇task这个方法存在于哪里的话,点击task,会直接跳转到Project.class
的源码去。
你会发现,所谓的这么一个task,定义的API,本质上就是Project的一个方法而已。
gradle中一个很重要的feature是,gradle中的task是活的,而不是死的。
task可以在配置阶段动态创建。
4. Lifecycle : Gradle的生命周期
4.1 任务图
Gradle 会在执行任何任务之前构建任务图。
在构建中的所有项目中,任务形成有向无环图 (DAG)。
4.2 构建阶段
Gradle 构建工具的生命周期可以细分为三个主要阶段:
-
初始化 (Initialization)
- 检测
settings.gradle(.kts)
文件是否存在 - 根据
settings.gradle(.kts)
文件创建Settings对象 (Settings实例和settings .gradle(.kts)文件相对应) - 根据Settings对象确定哪些子项目将参与构建过程
- 为每个项目创建对应的
Project
实例 (build.gradle(.kts)和Project相对应),并建立整个多项目构建的结构
- 检测
-
配置 (Configuration)
- 进入配置阶段后,
Gradle
会根据每个Project
加载其目录下对应的build.gradle(.kts)
- Gradle 会加载每个项目中的
build.gradle
或build.gradle.kts
文件,根据其中的脚本定义来配置各个项目。 - 在此阶段,Gradle 解析所有任务、依赖关系以及自定义插件等设置,并创建相应的Task对象。
- 用户可以通过扩展点如
plugins
、dependencies
、tasks
块来自定义构建行为。
- 进入配置阶段后,
-
执行 (Execution)
- Gradle 按照任务间的依赖关系来调度执行任务,确保前置任务成功完成后才会执行后续依赖于它的任务。
- 执行阶段包括编译源代码、打包资源、运行测试、生成工件(如JAR、WAR文件)等操作。
- 任务的执行可以并行进行。
Gradle 的强大之处在于它允许开发者在上述每个阶段插入定制的行为,例如通过添加钩子函数(如beforeSettings
、projectsEvaluated
等)来扩展其功能。此外,在执行阶段,Gradle 使用增量构建技术来提高构建效率,仅处理自上次构建以来发生变化的部分。
在Gradle中,创建一个Settings实例是构建生命周期的第一步。Settings实例负责确定哪些项目应该包含在构建中,并为每个项目创建一个Project实例。这通常是通过解析settings.gradle或settings.gradle.kts文件来完成的,这些文件位于项目的根目录下。
5. Hook : Gradle中的钩子函数
Gradle中的Hook函数(也称为生命周期回调)允许你在构建生命周期的不同阶段插入自定义逻辑。这些Hook函数允许你扩展和定制Gradle的行为,以满足特定的构建需求。以下是一些Gradle中常用的Hook函数:
- 构建初始阶段(
Initialization
)settingsEvaluated
: 完成项目的配置阶段之后调用 (只能定义在seting.gradle
或init.gradle
脚本中)projectsLoaded
: 所有项目加载之后调用 (只能定义在setting.gradle
或init.gradle
脚本中)
- 配置阶段(
Configuration
)beforeProject
: 每个项目完成配置之前调用 (只能定义在setting.gradle
或init.gradle
脚本中)afterProject
: 每个项目完成配置之后调用projectEvaluated
: 所有项目全部完成配置之后调用afterEvaluate
: 整个配置阶段完成后调用taskGraph.whenReady
: 全部任务图已经构建完成可以就绪后调用
- 执行阶段(
Execution
)taskGraph.beforeTask
: 执行每一个任务之前调用taskGraph.afterTask
: 每一个任务执行完成之后调用buildFinished
: 整个构建全部结束后调用
6. Gradle系列文章
Android Gradle 开发与应用 (一) : Gradle基础-CSDN博客
Android Gradle开发与应用 (二) : Groovy基础语法-CSDN博客
Android Gradle开发与应用 (三) : Groovy语法概念与闭包-CSDN博客
Android Gradle开发与应用 (四) : Gradle构建与生命周期-CSDN博客
基于Gradle 8.2,创建Gradle插件-CSDN博客
Android Gradle插件开发_实现自动复制文件插件