Gradle 的生命周期分为三个主要阶段:
1. 初始化阶段(Initialization Phase)
- 作用:确定哪些项目将参与构建,并为每个项目创建 Project 实例
- 执行内容:
- 读取
settings.gradle或settings.gradle.kts文件 - 根据
include语句确定项目结构 - 为每个包含的项目创建 Project 实例
- 执行
init.gradle(如果存在)
- 读取
- 示例:
groovy
// settings.gradle rootProject.name = 'my-project' include 'app', 'library', 'common'
2. 配置阶段(Configuration Phase)
- 作用:执行所有项目的构建脚本,构建任务依赖图
- 执行内容:
- 执行每个项目的
build.gradle或build.gradle.kts - 配置项目属性、插件、依赖
- 创建和配置所有任务
- 建立任务之间的依赖关系
- 执行每个项目的
- 特点:
- 即使只执行一个任务,也会配置所有项目
- 可以通过
gradle -m或--dry-run查看将要执行的任务
- 优化技巧:
groovy
// 使用 onlyIf 或 enabled 来跳过不必要的配置 tasks.register('myTask') { onlyIf { project.hasProperty('enableMyTask') } }
3. 执行阶段(Execution Phase)
- 作用:按照任务依赖图执行实际的任务
- 执行内容:
- 只执行在命令行中指定的任务及其依赖任务
- 执行任务的 action 逻辑
- 支持增量构建,只处理变更的文件
- 特点:
- 任务的执行顺序由依赖关系决定
- 支持并行执行(通过
--parallel参数) - 支持持续构建(通过
--continuous参数)
生命周期钩子
Gradle 提供了多个生命周期钩子来在特定阶段执行自定义逻辑:
groovy// 初始化阶段 gradle.projectsLoaded { println "所有项目已加载" } // 配置阶段 gradle.beforeProject { project -> println "配置项目: ${project.name}" } gradle.afterProject { project -> println "项目 ${project.name} 配置完成" } // 执行阶段 gradle.taskGraph.whenReady { graph -> println "任务图已准备就绪" } gradle.taskGraph.beforeTask { task -> println "准备执行任务: ${task.name}" } gradle.taskGraph.afterTask { task, state -> println "任务 ${task.name} 执行完成,状态: ${state.failure ? '失败' : '成功'}} }
性能优化建议
- 减少配置阶段的工作量:将不必要的逻辑移到执行阶段
- 使用延迟初始化:使用
tasks.register()而不是tasks.create() - 避免在配置阶段进行 I/O 操作:如网络请求、文件读写等
- 使用配置缓存:通过
--configuration-cache参数启用