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
報告