Gradle 你们并不陌生,但我相信你会使用它配置一些依赖,编写一些脚本,可是你确定不知道怎么看他的性能状况,今天 Tamic 就带你跟踪 Gradle Task 执行状况。html
Gradle提供了两种用于跟踪构建的内置机制:--profile
和--scan
。前者生成一个任务执行时间的简单HTML报告。你能够大体了解时间消耗在哪里,但不太可能收集任何有用的信息。后者向Gradle的服务器(或Gradle Enterprise安装)发送详细报告,其中包含更多详细的信息。java
任务详细信息在与其执行相对应的并发时间轴上呈现。对于CI构建,我想看更详细的东西用这个命令 --profile
,若是不喜欢将每一个构建的细节发送到Gradle 则采用-scan
。考虑到他们的插件在本地拥有全部这些信息可是选择远程渲染它彷佛彻底没有必要。git
该探索项目在几年前就由google发起,以此来衡量肯定性能速度。经过建立诸如ABI破坏性更改,ABI兼容更改,Android资源更改等方案,该工具能够屡次运行这些方案以首先 预加载JVM,而后生成准确执行的图片。它提供集成和输出,可与基于JVM的流行性能分析工具(如YourKit和Java Flight Recorder)配合使用。github
对于CI构建,经过 Gradle分析器执行将是一个很是难理解的抽象使用。咱们可使用它来获取一些信息,并在单个构建上集成运行它。 Java Flight Recorder能够在单个Gradle构建中使用jcmd
JDK中的二进制文件,并在文件中java 代码作指定标记。甚至还有Gradle插件能够自动启动和中止录制。而后,咱们能够在Java Mission Control 中打开生成的文件,或使用命令行工具将其转换为性能trace图。org.gradle.jvmargsgradle.properties.jfr
chrome
SDK搜索 gradle的trace图bash
Java Flight Recorder
能够在单个Gradle
构建中使用jcmdJDK
中的二进制文件,并在能够在本身的文件中指定标记。甚至还有Gradle
插件能够自动启动和中止录制。接下来,就能够在Java Mission Control中打开生成的文件,或使用命令行工具将其转换为trace图。 org.gradle.jvmargsgradle.properties.jfr
服务器
trace图能够显示在构建过程当中在任务内部花费的时间。可是,堆栈与任务无关,所以请务必记住您正在查看更大的图片。这也不处理与本身的守护进程通讯的任务,例如Kotlin编译器。并发
虽然这会产生漂亮的输出,但它的实用程序很小,而且Gradle插件集成不是最稳定的。除非你打算直接创建一个强大的集成,不然我不会在CI上使用它jcmd。当您有一小部分要运行的任务而不是整个项目的构建时,这些可视化效果很好。app
Gradle Profiler还包括对Chrome跟踪的支持。使用systrace工具的 Android用户会熟悉此输出。咱们再次将它集成到咱们的构建中,而无需跳过Gradle分析器。jvm
用于生成Chrome跟踪的代码位于Gradle探查器存储库中。克隆并构建将生成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事件。
不幸的是,每一个任务的粒度接近于零。做为任务的一部分,对工人没有任何看法。咱们没法得到任务内部调用堆栈的trace图。
将此添加到SDK Search的CI版本中,除了您已经生成的其余报告以外,若是想要查看完整集成
https://github.com/JakeWharton/SdkSearch/commit/3cc9bd8bc9741cf8459bf975a186e0c36e5481d8。
二者都不完美,但二者在不一样状况下都有用。但愿未来对工做人员的可见性将添加到Chrome跟踪中。弄清楚如何将Java Flight Recorder数据合并到Chrome跟踪中也是一个惊人的补充。目前,在CI上运行Chrome跟踪能够很好地了解构建的执行状况,而后能够手动或使用Gradle Profiler来使用Java Flight Recorder来深刻了解各个任务的性能。
--profile
报告 Chrome
跟踪 JFR trace 图 --scan
报告