Android studio 跟踪 Gradle Task 执行

2,884 阅读4分钟

Gradle 大家并不陌生,但我相信你会使用它配置一些依赖,编写一些脚本,但是你肯定不知道怎么看他的性能情况,今天 Tamic 就带你跟踪 Gradle Task 执行情况。

--profile 和--scan

Gradle提供了两种用于跟踪构建的内置机制:--profile--scan。前者生成一个任务执行时间的简单HTML报告。你可以大致了解时间消耗在哪里,但不太可能收集任何有用的信息。后者向Gradle的服务器(或Gradle Enterprise安装)发送详细报告,其中包含更多详细的信息。

任务详细信息在与其执行相对应的并发时间轴上呈现。对于CI构建,我想看更详细的东西用这个命令 --profile ,如果不喜欢将每个构建的细节发送到Gradle 则采用-scan。考虑到他们的插件在本地拥有所有这些信息但是选择远程渲染它似乎完全没有必要。

该探索项目在几年前就由google发起,以此来衡量确定性能速度。通过创建诸如ABI破坏性更改,ABI兼容更改,Android资源更改等方案,该工具可以多次运行这些方案以首先 预加载JVM,然后生成准确执行的图片。它提供集成和输出,可与基于JVM的流行性能分析工具(如YourKit和Java Flight Recorder)配合使用。

对于CI构建,通过 Gradle分析器执行将是一个非常难理解的抽象使用。我们可以使用它来获取一些信息,并在单个构建上集成运行它。 Java Flight Recorder可以在单个Gradle构建中使用jcmdJDK中的二进制文件,并在文件中java 代码做指定标记。甚至还有Gradle插件可以自动启动和停止录制。然后,我们可以在Java Mission Control 中打开生成的文件,或使用命令行工具将其转换为性能trace图。org.gradle.jvmargsgradle.properties.jfr

SDK搜索 gradle的trace图

Java Flight Recorder可以在单个Gradle构建中使用jcmdJDK中的二进制文件,并在可以在自己的文件中指定标记。甚至还有Gradle插件可以自动启动和停止录制。接下来,就可以在Java Mission Control中打开生成的文件,或使用命令行工具将其转换为trace图。 org.gradle.jvmargsgradle.properties.jfr

trace图可以显示在构建过程中在任务内部花费的时间。但是,堆栈与任务无关,因此请务必记住您正在查看更大的图片。这也不处理与自己的守护进程通信的任务,例如Kotlin编译器。

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

Gradle Profiler还包括对Chrome跟踪的支持。使用systrace工具的 Android用户会熟悉此输出。我们再次将它集成到我们的构建中,而无需跳过Gradle分析器。

用于生成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报告