Gradle提供了两种用于跟踪构建的内置机制:--profile
和--scan
。前者生成任务执行时间的简单HTML报告。您可以大致了解花费的时间,但不太可能收集任何真实的见解。后者会向Gradle的服务器(或Gradle Enterprise安装)发送详细的报告,其中包含更多的详细信息。任务详细信息在与它们的执行相对应的并发时间轴上呈现。对于CI构建,我倾向于要比粒度更细的东西,--profile
但我不喜欢将每个构建的详细信息发送给Gradle的想法--scan
。似乎完全没有必要考虑他们的插件在本地拥有所有这些信息,而是选择远程呈现它。
该摇篮探查项目开始几年前,以此来衡量确定性积聚速度。通过创建诸如破坏ABI的更改,与ABI兼容的更改,Android资源更改之类的方案,该工具可以多次运行这些方案以首先预热JVM,然后对执行的内容进行准确的描述。它提供了集成和输出,可与流行的基于JVM的性能分析工具(例如YourKit和Java Flight Recorder)一起使用。
对于CI构建,通过Gradle Profiler执行将是令人讨厌的抽象方法。相反,我们可以将其用于灵感,并在单个构建中运行其集成。
Java的飞行记录器可以在各个摇篮被用来建立与jcmd
JDK中的二进制和使用,以标志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
报告