5月27日 23:16
Gradle 的生命周期包括哪些阶段?
三个阶段:初始化 → 配置 → 执行
Gradle 构建生命周期分为 初始化(Initialization)、配置(Configuration)、执行(Execution) 三个阶段,依次完成项目确定、任务图构建和任务执行。
初始化阶段
读取 settings.gradle,确定参与构建的项目并为每个项目创建 Project 实例:
groovy// settings.gradle rootProject.name = 'my-app' include 'app', 'core', 'utils'
钩子:gradle.projectsLoaded
配置阶段
执行所有项目的 build.gradle,配置插件、依赖和任务,建立任务依赖图。无论最终执行哪个任务,所有项目的构建脚本都会被执行——这是性能问题的常见来源。
groovy// 延迟注册任务,避免配置阶段不必要的开销 tasks.register('myTask') { onlyIf { project.hasProperty('enableMyTask') } }
钩子:gradle.beforeProject / gradle.afterProject
执行阶段
按依赖图顺序执行目标任务及其依赖。支持增量构建(仅处理变更文件)和并行执行(--parallel)。
钩子:gradle.taskGraph.whenReady / gradle.taskGraph.beforeTask / gradle.taskGraph.afterTask
常见追问
Q: 为什么配置阶段会成为性能瓶颈?
每个项目的 build.gradle 都会执行,即使只跑一个任务。大量 I/O 或复杂逻辑放在配置阶段会拖慢整个构建。应使用 tasks.register() 延迟创建、启用 --configuration-cache 缓存配置结果。
Q: afterEvaluate 的作用?
在项目配置完成后回调,常用于在插件配置完成后再添加依赖或修改属性,确保顺序正确。
Q: 增量构建的原理?
Gradle 为每个 Task 维护输入输出的哈希,若输入输出均未变化则跳过执行(标记 UP-TO-DATE),而非真正重新运行。