Skip to content

构建生命周期与监控

Gradle 的构建过程是一个复杂的有向无环图(DAG)。掌握其生命周期钩子(Hooks),是实现构建监控、自动任务插入和性能优化的基础。

生命周期核心钩子

settings.gradle.ktsinit.gradle.kts 中,你可以拦截构建的不同阶段。

初始化阶段监控

kotlin
// 发生于 settings.gradle 被解析前
gradle.beforeSettings {
    println("正在初始化构建环境...")
}

配置阶段监控

kotlin
// 每个 Project 对象创建后,但 build.gradle 还没跑
gradle.allprojects {
    afterEvaluate {
        // 在此处可以检查该模块是否漏写了某些插件或属性
        if (!pluginManager.hasPlugin("com.android.application")) {
            // ...
        }
    }
}

任务执行图就绪

kotlin
// 这是最有用的钩子:Gradle 已经算好了要跑哪些 Task,但还没开始跑
gradle.taskGraph.whenReady {
    val allTasks = allTasks.map { it.name }
    if (allTasks.contains("release")) {
        // 如果是发布任务,强制检查环境
    }
}

实战:构建自定义耗时统计器

你可以通过拦截 Task 执行开始和结束的时间,生成一份轻量级的本地报告。

kotlin
abstract class TimeMonitoringService : BuildService<TimeMonitoringService.Params>, OperationCompletionListener {
    override fun onFinish(event: FinishEvent) {
        val duration = event.result.endTime - event.result.startTime
        println("Task \${event.descriptor.name} 耗时: \${duration}ms")
    }
}

构建失败深度诊断

当构建失败时,除了查看 Stacktrace,你还可以通过以下方式获取更多上下文:

  1. --info: 查看每个 Task 的输入输出指纹比对。
  2. --debug: 输出极其详尽的构建日志(慎用,文件极大)。
  3. --stacktrace: 展示代码层面的失败位置。

性能优化建议

  • 减少 afterEvaluate 的使用: 它会破坏配置缓存的稳定性。尽量使用 Lazy API 的回调。
  • 按需监听: 不要监听每一个任务的执行,这会增加构建进程的开销。

通过深度介入 Gradle 生命周期,你可以让构建过程变得“透明”且“可控”。