擷取 Macrobenchmark 指標

指標是從基準測試擷取的主要資訊類型。系統會將這些值以 List 的形式傳送至 measureRepeated 函式,讓您一次指定多個評估指標。基準測試需要至少一種指標才能執行。

下列程式碼片段會擷取影格時間和自訂追蹤區塊的指標:

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

在此範例中,RV CreateViewRV OnBindViewRecyclerView 中定義可追溯區塊的 ID。createViewHolder() 方法的原始碼範例則示範如何在您自己的程式碼中定義可追蹤區塊。

StartupTimingMetricTraceSectionMetricFrameTimingMetricPowerMetric 會在本文後續章節詳細說明。

基準測試結果會輸出到 Android Studio,如圖 1 所示。如果定義了多項指標,所有指標都會合併到輸出內容。

TraceSectionMetric 和 FrameTimingMetric 的結果
圖 1. TraceSectionMetricFrameTimingMetric 的結果。

StartupTimingMetric

StartupTimingMetric 會使用下列值擷取應用程式啟動時間指標:

  • timeToInitialDisplayMs:從系統收到啟動意圖,到轉譯目標 Activity 第一個影格的時間長度。
  • timeToFullDisplayMs:從系統收到啟動意圖,到應用程式使用 reportFullyDrawn() 方法回報完成繪製的時間長度。發出 (或包含) reportFullyDrawn() 呼叫後,測量作業會在第一個影格轉譯完成時停止。上述測量方式可能不適用於 Android 10 (API 級別 29) 以下版本。

如要進一步瞭解影響應用程式啟動時間的因素,請參閱「應用程式啟動時間」。

StartupTimingMetric 結果
圖 2. StartupTimingMetric 結果。

提高啟動時間準確度

有兩個重要指標可以測量應用程式啟動時間,分別是初始顯示時間 (TTID)完整顯示時間 (TTFD)。TTID 是顯示應用程式 UI 第一個影格所需的時間。TTFD 也包括在初始影格顯示後,以非同步載入方式顯示內容所需的時間。

呼叫 ComponentActivityreportFullyDrawn() 方法後,系統就會回報 TTFD。如果從未呼叫 reportFullyDrawn(),系統會改為回報 TTID。您可能需要將呼叫 reportFullyDrawn() 的時間延後到非同步載入作業完成後。舉例來說,如果 UI 包含 RecyclerViewLazy 清單等動態清單,填入清單的背景工作可能是在清單首次繪製後才完成,也因此是在 UI 標示為已完成繪製後才完成。在這類情況下,基準測試就不會納入清單填入作業。

如要將清單填入作業納入基準測試時間,請使用 getFullyDrawnReporter() 取得 FullyDrawnReporter,然後在應用程式程式碼中新增回報器。一旦背景工作完成清單填入作業,請務必釋放回報器。

等到所有新增的回報器都已釋放後,FullyDrawnReporter 才會呼叫 reportFullyDrawn() 方法。因此請等到背景程序完成後再新增回報器,這樣一來,時間就也會納入在啟動時間資料內填入清單所需的時間。對使用者而言,這並不會改變應用程式行為,但可讓啟動時間資料包含填入清單所需的時間。

如果應用程式使用 Jetpack Compose,您可以運用下列 API 表示已完成繪製的狀態:

  • ReportDrawn:表示可組合項可立即準備好進行互動。
  • ReportDrawnWhen:使用 list.count > 0 等述詞,表示可組合項何時能準備好進行互動。
  • ReportDrawnAfter:採用暫停方法,完成後就會表示可組合項已準備好進行互動。

FrameTimingMetric

FrameTimingMetric 會從基準測試產生的影格擷取時間資訊,例如捲動或動畫,然後輸出下列值:

  • frameOverrunMs:所指定影格錯過期限後的時間長度。正數代表出現掉格,且有可見的卡頓或延遲。負數代表影格提早多少時間於期限前完成。注意:這個值僅適用於 Android 12 (API 級別 31) 以上版本。
  • frameDurationCpuMs:在 UI 執行緒和 RenderThread CPU 上產生影格所需的時間長度。

測量結果的分布依序為百分之 50、90、95 和 99。

如要進一步瞭解如何找出及改善緩慢影格,請參閱「轉譯速度緩慢」。

FrameTimingMetric 結果
圖 3. FrameTimingMetric 結果。

TraceSectionMetric

TraceSectionMetric 會擷取與所提供 sectionName 相符的追蹤區塊次數和耗費時間長度。它會輸出時間的最小值、中位數和最大值 (以毫秒為單位)。定義追蹤區塊的是函式呼叫 trace(sectionName)Trace.beginSection(sectionName)Trace.endSection() (或兩者的非同步變化版本) 之間的程式碼。系統一律會選取測量期間擷取的第一個追蹤區段。根據預設,它只會輸出套件中的追蹤區段;如要加入套件外的程序,請設定 targetPackageOnly = false

如要進一步瞭解追蹤功能,請參閱「系統追蹤總覽」和「定義自訂事件」。

TraceSectionMetric
圖 4. TraceSectionMetric 結果。

PowerMetric

針對提供的電源類別PowerMetric 會在測試期間擷取電量或能量變化。每個選取的類別都會細分為可測量的子元件,未選取的類別則會計入「未選取」指標。

這些指標測量的是整個系統 (而非個別應用程式) 的耗電量,且目前僅適用於 Pixel 6、Pixel 6 Pro 和後續裝置:

  • power<category>Uw:這個類別在測試期間的耗電量。
  • energy<category>Uws:這個類別在測試期間每單位時間所轉移的能量。

類別如下:

  • CPU
  • DISPLAY
  • GPU
  • GPS
  • MEMORY
  • MACHINE_LEARNING
  • NETWORK
  • UNCATEGORIZED

CPU 等部分類別中,可能很難區分完成工作的是其他程序或您的應用程式。如要將干擾降到最低,請移除或限制不必要的應用程式和帳戶。

PowerMetric 結果
圖 5. PowerMetric 結果。