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


相关文章
|
2月前
|
Java Maven
maven跳过测试清理、打包、安装
maven跳过测试清理、打包、安装
92 4
|
9月前
|
测试技术 API
【OS Pintos】Project1 项目要求说明 | 进程中止信息 | 参数传递 | 用户内存访问 | 有关项目实现的建议
【OS Pintos】Project1 项目要求说明 | 进程中止信息 | 参数传递 | 用户内存访问 | 有关项目实现的建议
106 0
|
8月前
gradle运行项目不显示异常
gradle运行项目不显示异常
60 0
|
测试技术 开发工具 Android开发
哪怕不学Gradle,这些开发中的常见操作,你也值得掌握(上)
Gradle 是每个 Android 同学都逃不开的一个话题。
117 0
哪怕不学Gradle,这些开发中的常见操作,你也值得掌握(上)
|
开发工具 Android开发
gradle编译打包过程分析之ProcessAndroidResources
引入源码 首先,如何查看gradle源码,我们在项目里依赖com.android.tools.build:gradle即可
270 0
|
Java 开发工具 git
|
ARouter 测试技术 Android开发
通过Gradle自动实现Android组件化模块构建
为什么我们要用Gradle管理组件呢? 先来看看Android组件化需要实现的目标 按照业务逻辑划分模块 项目模块能够单独启动测试 能够根据需求引入或删除某些业务模块 通过不同模块的组合,组成不同的App 对于第一点:需要根据技术架构和业务架构来划分模块,这里需要根据实际情况来考虑。
1706 0