Gradle构建与生命周期
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)。
![](https://img-blog.csdnimg.cn/direct/9dca94b94d6f4e48a4a0b0a865660b2f.png)
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 : 整个构建全部结束后调用