来源于:http://stackoverflow.com/questions/13031538/track-execution-time-per-task-in-gradle-script
https://gist.github.com/nikos/3939407
https://github.com/Scuilion/gradle-utils/blob/master/src/main/groovy/com/scuilion/gradle/plugins/utils/debug/TestTiming.groovy
一)使用--profile参数
如:gradlew AssembleDebug --profile,会在build/reports/profile生出相应的时间统计数据,如下图:
二)编写脚本,实现TaskExecutionListener 接口并使用gradle.taskGraph.addTaskExecutionListener 注册。
如:
// Log timings per task.
class TimingsListener implements TaskExecutionListener, BuildListener {
private Clock clock
private timings = []
@Override
void beforeExecute(Task task) {
clock = new org.gradle.util.Clock()
}
@Override
void afterExecute(Task task, TaskState taskState) {
def ms = clock.timeInMs
timings.add([ms, task.path])
task.project.logger.warn "${task.path} took ${ms}ms"
}
@Override
void buildFinished(BuildResult result) {
println "Task timings:"
for (timing in timings) {
if (timing[0] >= 50) {
printf "%7sms %s\n", timing
}
}
}
@Override
void buildStarted(Gradle gradle) {}
@Override
void projectsEvaluated(Gradle gradle) {}
@Override
void projectsLoaded(Gradle gradle) {}
@Override
void settingsEvaluated(Settings settings) {}
}
gradle.addListener new TimingsListener()
关于TaskExecutionListener,见:https://docs.gradle.org/current/javadoc/org/gradle/api/execution/TaskExecutionListener.html
三)只计算某些任务的时间
有选择的注册TaskExecutionListener 接口,如:
TestTiming.groovy:
package com.scuilion.gradle.plugins.utils.debug | |
import com.scuilion.gradle.plugins.utils.UtilsProperties | |
import org.gradle.api.Project | |
class TestTiming { | |
static void addTask(Projectproject) { | |
project.task('testTiming') { | |
} | |
if (project.hasProperty('timeTests')) { | |
project.rootProject.gradle.addListener new TestTimingListener() | |
} | |
project.tasks.testTiming.group= UtilsProperties.GROUP | |
project.tasks.testTiming.description= "Add property 'timeTests' to get test runtime." | |
} | |
} |