最近,我正在帮助一个Android团队调查一个难以解决的问题,这个问题表现为编译和注释处理任务运行时间很长。 他们的大多数构建只需要几分钟,但有时却需要30分钟!在这些情况下,构建扫描总是显示,Java编译、Kotlin编译或Kapt注释处理的某种组合,是罪魁祸首。 团队并不清楚这个问题对开发者来说有多频繁,以及在什么情况下发生。
Gradle Enterprise还没有提供一种方法,可以根据某项任务所花的时间找到构建。然而,自定义标签使得它可以很容易地对构建中可以检测到的任何情况进行分类并找到构建 通过标记所有过长的构建,我们可以使用Gradle Enterprise来了解其影响和严重性,以及它们发生的背景,这就加速了调试工作。
为了实现这个目标,我们只需在构建中添加类似下面这个代码块的东西。
// root build.gradle
subprojects {
tasks.matching { t ->
t instanceof org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|| t instanceof org.jetbrains.kotlin.gradle.internal.KaptWithKotlincTask
|| t instanceof com.android.build.gradle.tasks.factory.AndroidJavaCompile
// || ... more ...
}.configureEach {
long start
doFirst {
start = System.currentTimeMillis()
}
doLast {
long duration = System.currentTimeMillis() - start
if (duration > 15 * 60 * 1000) { // 15 min
buildScan.tag "TooLong"
buildScan.value "TooLong", path
}
}
}
}
如果任何感兴趣的任务运行时间超过15分钟,这个代码块就会给构建打上 "TooLong "的标签。此外,它还会给构建添加一个以任务路径为值的自定义值,这样我们就能准确地知道哪个(些)任务是任何特定构建的罪魁祸首。然后,这个标签或自定义值可以作为Gradle Enterprise的搜索标准,找到所有出现问题的构建。
这只是根据发生的事情对构建进行标记的一个例子。用于标记构建的API与Gradle丰富而广泛的用于查询构建的API相结合,为我们提供了许多可能性。