Gradle 提供多種方式來檢查您的建置

  • 使用建置掃描進行剖析

  • 本機剖析報告

  • 低層級剖析

什麼是建置掃描?

建置掃描是執行建置時所發生事件的持續性、可共用記錄。建置掃描提供建置的深入資訊,您可以使用這些資訊來找出效能瓶頸並加以修正。

在 Gradle 4.3 以上版本中,您可以使用 --scan 命令列選項來建立建置掃描

$ gradle build --scan

對於較舊的 Gradle 版本,建置掃描外掛程式使用者手冊說明如何啟用建置掃描。

在建置結束時,Gradle 會顯示一個 URL,您可以在其中找到建置掃描

BUILD SUCCESSFUL in 2s
4 actionable tasks: 4 executed

Publishing build scan...
https://gradle.com/s/e6ircx2wjbf7e

本節說明如何使用建置掃描來剖析您的建置。

使用建置掃描進行剖析

效能頁面可以協助使用建置掃描來剖析建置。若要前往該頁面,請按一下左側導覽功能表中的「效能」,或按一下建置掃描首頁上的「探索效能」連結

build scan home
圖 1. 建置掃描首頁上的效能頁面連結

效能頁面顯示完成建置不同階段所花費的時間。此頁面顯示完成下列動作所花費的時間

  • 啟動

  • 設定建置專案

  • 解析相依性

  • 執行任務

您還可以取得環境屬性的詳細資料,例如是否已使用守護程式。

build scan performance page
圖 2. 建置掃描效能頁面

在上述建置掃描中,組態花費超過 13 秒。按一下「組態」標籤,將此階段分解為組成部分,找出緩慢的原因。

build scan configuration breakdown
圖 3. 建置掃描組態細目

在這裡,您可以看到套用至專案的腳本和外掛,依據套用時間長度遞減排列。最慢的外掛和腳本套用是最佳的最佳化候選。例如,腳本 script-b.gradle 套用一次,但花費 3 秒。展開該列,查看建置套用此腳本的位置。

script b application
圖 4. 顯示 script-b.gradle 套用至建置

您可以看到子專案 :app1 從該子專案的 build.gradle 檔案中套用腳本一次。

剖析報告

如果您不喜歡使用建置掃描,您可以在根專案的 build/reports/profile 目錄中產生 HTML 報告。若要產生此報告,請使用 --profile 命令列選項

$ gradle --profile <tasks>

每個剖析報告的名稱中都有時間戳記,以避免覆寫現有的報告。

報告會顯示執行建置所需時間的細目。不過,此細目並不像建置掃描那麼詳細。下列剖析報告顯示可用的不同類別

Sample Gradle profile report
圖 5. 剖析報告範例

低階剖析

有時,即使您的建置腳本一切都做對了,您的建置還是會很慢。這通常是因為外掛和自訂任務效率不彰,或是資源受限。使用 Gradle Profiler 找出此類瓶頸。使用 Gradle Profiler,您可以定義場景,例如「在進行 ABI 中斷變更後執行『組裝』」,並執行您的建置多次以收集剖析資料。使用 Profiler 產生建置掃描。或將其與 JProfiler 和 YourKit 等方法剖析器結合。這些剖析器可以協助您找出自訂外掛中效率不彰的演算法。如果您發現 Gradle 本身中的某些項目會讓您的建置變慢,請毫不猶豫地將剖析器快照傳送至 performance@gradle.com

效能類別

建置掃描和本機設定檔報告會將建置執行細分為相同的類別。下列各節說明這些類別。

啟動

這反映了 Gradle 的初始化時間,其中大部分包括

  • JVM 初始化和類別載入

  • 如果您使用 wrapper 下載 Gradle 發行版

  • 如果尚未執行合適的守護程式,則啟動守護程式

  • 執行 Gradle 初始化指令碼

即使建置執行的啟動時間很長,後續執行通常會看到啟動時間大幅下降。持續緩慢的建置啟動時間通常是 init 指令碼中問題的結果。仔細檢查您在那裡執行的作業是否必要且效能良好。

設定和buildSrc

在啟動後,Gradle 會初始化您的專案。通常,Gradle 只會處理您的設定檔。如果您在 buildSrc 目錄中自訂建置邏輯,Gradle 也會處理該邏輯。在建置 buildSrc 一次後,Gradle 會認為它是最新的。最新檢查所需時間遠少於邏輯處理。如果您的 buildSrc 階段花費太多時間,請考慮將其分拆成一個獨立專案。然後您可以將該專案的 JAR 人工製品新增為相依性。

設定檔很少包含具有大量 I/O 或運算的程式碼。如果您發現 Gradle 處理它需要很長的時間,請使用更傳統的設定檔方法,例如 Gradle Profiler,以找出原因。

載入專案

載入專案通常不需要花費大量時間,您也無法控制它。在此花費的時間基本上是建置中專案數量的函式。