Gradle构建耗时统计可通过监听生命周期事件实现:1.用beforeEvaluate/afterEvaluate统计配置阶段;2.用taskGraph.beforeTask/afterTask统计单个task执行耗时;3.用buildStarted/buildFinished统计整体构建总耗时与失败原因;4.可封装为自定义Plugin统一管理。

在 Gradle 构建过程中,可以通过监听构建生命周期事件(如 beforeProject、afterProject、buildFinished 等)来统计各阶段耗时。Java 项目中无需额外依赖,直接在 build.gradle 或 init.gradle 中注册监听器即可。
使用 Project.beforeEvaluate / afterEvaluate 统计配置阶段耗时
配置阶段(Configuration Phase)是解析 build script、执行闭包、配置 task 的过程。耗时过高常因动态 task 创建、大量插件 apply 或闭包逻辑过重引起。
- 在
build.gradle顶部定义开始时间戳 - 用
project.afterEvaluate { ... }获取结束时间并打印差值 - 注意:必须在
beforeEvaluate中设起始时间,否则可能被延迟执行
示例:
def configStartTime = System.nanoTime()
project.beforeEvaluate {
configStartTime = System.nanoTime()
}
project.afterEvaluate {
def durationMs = (System.nanoTime() - configStartTime) / 1_000_000
logger.lifecycle("✅ 配置阶段耗时: ${durationMs.round(2)} ms")
}
监听 Task 执行前后统计单个 Task 耗时
Gradle 提供 taskGraph.beforeTask 和 taskGraph.afterTask,适合精确测量每个 task 的执行时间(Execution Phase),尤其用于定位慢 task。
- 需在
gradle.build的gradle.taskGraph.whenReady块中注册 - 用
ThreadLocal或 Map 存储每个 task 的开始时间,避免并发干扰 - 推荐只对关键 task(如
compileJava、test)打点,避免日志爆炸
示例:
gradle.taskGraph.whenReady { graph ->
def taskStartTimes = [:]
graph.beforeTask { task ->
taskStartTimes[task.path] = System.nanoTime()
}
graph.afterTask { task, state ->
def start = taskStartTimes[task.path]
if (start) {
def ms = (System.nanoTime() - start) / 1_000_000
if (ms > 500) { // 只打印超过 500ms 的 task
logger.warn("⚠️ ${task.path} 执行耗时: ${ms.round(2)} ms")
}
}
}
}
用 buildFinished 监听整体构建总耗时与失败原因
gradle.buildFinished 是构建生命周期终点,可捕获最终状态和异常,适合汇总统计 + 错误归因。
- 配合
gradle.startParameter可识别是否为 daemon 构建或 --no-daemon 模式 - 记录构建成功/失败、总耗时、JVM 参数(如堆大小)、Gradle 版本等上下文
- 可用于生成本地构建报告(写入
build/timing.log)
示例:
def buildStartTime = System.currentTimeMillis()
gradle.addBuildListener(new BuildAdapter() {
@Override
void buildStarted(Gradle gradle) {
buildStartTime = System.currentTimeMillis()
}
<pre class="brush:php;toolbar:false;">@Override
void buildFinished(BuildResult result) {
def totalMs = System.currentTimeMillis() - buildStartTime
def status = result.failure ? "❌ 失败" : "✅ 成功"
logger.lifecycle("? 构建完成: $status | 总耗时: ${totalMs} ms | Gradle: ${gradle.gradleVersion}")
if (result.failure) {
logger.error("? 异常: ${result.failure}")
}
}})
进阶:用自定义 Plugin 封装耗时监控能力
若多个子项目都需要统一监控,建议提取为独立 plugin(如 build-timing-plugin),便于复用和开关控制。
- 在
src/main/groovy中实现Plugin<project></project> - 通过
project.extensions.create('timing', TimingExtension)支持配置开关、阈值、输出格式 - 发布到本地 maven 或 Nexus,子项目只需
plugins { id 'com.example.timing' version '1.0' }
这样既保持主构建脚本干净,又能统一管理监控策略(比如仅在 CI 环境开启详细统计)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











