跟踪Gradle任务执行

Gradle提供了两种用于跟踪构建的内置机制:--profile--scan。前者生成任务执行时间的简单HTML报告。您可以大致了解花费的时间,但不太可能收集任何真实的见解。后者会向Gradle的服务器(或Gradle Enterprise安装)发送详细的报告,其中包含更多的详细信息。任务详细信息在与它们的执行相对应的并发时间轴上呈现。对于CI构建,我倾向于要比粒度更细的东西,--profile但我不喜欢将每个构建的详细信息发送给Gradle的想法--scan。似乎完全没有必要考虑他们的插件在本地拥有所有这些信息,而是选择远程呈现它。

该摇篮探查项目开始几年前,以此来衡量确定性积聚速度。通过创建诸如破坏ABI的更改,与ABI兼容的更改,Android资源更改之类的方案,该工具可以多次运行这些方案以首先预热JVM,然后对执行的内容进行准确的描述。它提供了集成和输出,可与流行的基于JVM的性能分析工具(例如YourKit和Java Flight Recorder)一起使用。

对于CI构建,通过Gradle Profiler执行将是令人讨厌的抽象方法。相反,我们可以将其用于灵感,并在单个构建中运行其集成。


Java的飞行记录器可以在各个摇篮被用来建立与jcmdJDK中的二进制和使用,以标志java指定的org.gradle.jvmargs在你的gradle.properties。甚至还有Gradle插件,可自动启动和停止录制。然后,我们可以.jfr在Java Mission Control中打开生成的文件,或使用命令行工具将其转换为flamegraph。

火焰图可以显示整个构建过程中任务在哪里花费的时间。但是,堆栈并不与任务相关,因此请务必记住您正在查看大图。这也不处理与自己的守护程序(例如Kotlin编译器)进行通信的任务。

虽然这会产生漂亮的输出,但它的实用程序很小,并且Gradle插件集成不是最稳定的。因此,除非您要直接建立与之的强大集成,否则我将避免在CI上使用此功能jcmd。当您要运行的任务只有一小部分而不是整个项目都在构建时,这些可视化效果很好。


Gradle探查器还包括对Chrome跟踪的支持。使用systrace工具的Android用户将熟悉此输出。同样,我们可以将其集成到我们的构建中,而无需跳过Gradle Profiler。

用于生成Chrome浏览器跟踪的代码存在于Gradle Profiler存储库中。克隆并构建将在上产生jar的项目subprojects/chrome-trace/build/libs/chrome-trace.jar。将此jar复制到gradle/项目目录中。这个jar包含一个可以在Gradle初始化脚本中应用的插件。

// init.gradle

initscript {
  dependencies {
    classpath files('gradle/chrome-trace.jar')
  }
}

rootProject {
  def date = new java.text.SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date())
  ext.chromeTraceFile = new File(rootProject.buildDir, "reports/trace/trace-${date}.html")
}

apply plugin: org.gradle.trace.GradleTracingPlugin

调用Gradle时,我们需要引用此脚本,还传递一个标志来启用跟踪。

$ ./gradlew --init-script init.gradle -Dtrace build

这将生成一个跟踪文件build/reports/trace/trace-(date).html,您可以在其中打开Chrome,并使用箭头键和ASDW键进行导航。

跟踪给出了并发任务执行和其中的计时的图片。--profile报告中没有的东西很少,但是以给您更多上下文的方式呈现。最值得注意和最欢迎的添加是CPU负载,堆大小和GC事件。

不幸的是,每个任务的粒度接近于零。没有洞察力是作为任务的一部分进行操作的工人的。我们无法获得任务内部调用堆栈的火焰图。

如果您希望看到完整的集成,我已经将其添加到SDK Search的CI版本中,此外它还已经生成了其他报告:https : //github.com/JakeWharton/SdkSearch/commit/3cc9bd8bc9741cf8459bf975a186e0c36e5481d8。


两者都不是完美的,但两者在不同情况下都可能有用。希望将来可以将对工作人员的可见性添加到Chrome跟踪中。弄清楚如何将Java Flight Recorder数据合并到Chrome跟踪中也将是一个了不起的补充。目前,在CI上运行Chrome跟踪可以很好地了解构建的性能,然后可以手动使用Java Flight Recorder或将其与Gradle Profiler结合使用,以挖掘各个任务的性能。

这是单个构建的四个跟踪输出:

  • --profile 报告

  • Chrome trace

  • JFR火焰图

  • --scan 报告

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农乐园

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值