跟踪Gradle任务执行

简介: 跟踪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 报告


相关文章
|
30天前
|
Android开发
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
Android gradle task任务检查各个module之间资源文件冲突.md
|
测试技术 Android开发 索引
第四章 Gradle任务
上一章我们已经介绍了Gradle脚本的基础,在其中我们也强调了Gradle中最要的Projects和Tasks这两个概念,尤其是Tasks,我们的所有Gradle的构建工作都是由Tasks组合完成的,那么这一章我们就详细的介绍下Tasks--任务。
181 0
第四章 Gradle任务
|
XML Java 测试技术
Gradle 2.0 用户指南翻译——第十五章. 任务详述
翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2.0 。
1588 0
|
Java API Android开发
Gradle 1.12用户指南翻译——第五十七章. 编写自定义任务类
其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/1.12。
1079 0
|
XML Java 测试技术
Gradle 1.12 翻译——第十五章. 任务详述
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41038305 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qiniudn.com 上的文档为准。
801 0
|
人工智能 移动开发 Java
Android Studio插件版本与Gradle 版本对应关系
Android Studio插件版本与Gradle 版本对应关系
2312 0
Android Studio插件版本与Gradle 版本对应关系
|
存储 Java Android开发
Android 开发 - 充分利用Gradle
Android 开发 - 充分利用Gradle
168 2
|
1月前
|
Android开发
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
Android基于gradle task检查各个module之间资源文件冲突情况
|
5月前
|
C# Android开发 开发者
Android gradle编译时字节码处理
Android gradle编译时字节码处理
63 1