組合追蹤

首次探究效能問題時,追蹤記錄通常是最佳資訊來源。追蹤記錄可用於擬定假設,並決定該從何處著手。

Android 支援兩種層級的追蹤:系統追蹤和方法追蹤。

系統追蹤只會追蹤標示要追蹤的範圍,因此負擔較低,不會對應用程式效能造成顯著影響。系統追蹤是很實用的功能,可協助您查看程式碼特定區段的執行時間。

方法追蹤會追蹤應用程式中的每項函式呼叫。這種做法的費用非常高昂,因此對應用程式的效能有很大的影響,但可讓您全面掌握實際情況、呼叫的函式,以及呼叫這些函式的頻率。

根據預設,系統追蹤不會包含個別可組合函式。在方法追蹤中可以使用。

我們目前正在測試新的系統追蹤功能,以顯示系統追蹤中的可組合函式。這種方法可以兼顧系統追蹤的低度干擾,以及組合內方法追蹤層級的詳細資料。

設定組合追蹤

如要試用專案中的重組追蹤功能,您至少須更新到下列版本:

  • Android Studio Flamingo
  • Compose UI:1.3.0
  • Compose Compiler: 1.3.0

執行追蹤的裝置或模擬器的最低 API 級別為 30。

此外,您需要在 Compose Runtime Tracing 中新增依附元件:

implementation("androidx.compose.runtime:runtime-tracing:1.0.0-beta01")

有了這個依附元件,當您擷取包含重組的系統追蹤記錄時,就會自動看到可組合函式。

進行系統追蹤

如要進行系統追蹤,並查看新重組追蹤的實際運作情形,請按照下列步驟操作:

  1. 開啟分析器:

    Android Studio - 開始剖析
    圖 2. Android Studio - 開始剖析
  2. 按一下「CPU timeline」

    Android Studio Profiler - CPU 時間軸
    圖 3. Android Studio Profiler - CPU 時間軸
  3. 操作應用程式前往要追蹤的 UI,然後依次選取「System Trace」和「Record」

    追蹤選項 - 系統追蹤
    圖 4. 追蹤選項 - 系統追蹤
  4. 使用應用程式以引起重組及停止記錄。追蹤記錄處理完畢並且顯示之後,應該就能在重組追蹤中看到可組合項。您可以使用鍵盤和滑鼠,在追蹤記錄周圍縮放及平移。如果不清楚如何導覽追蹤記錄,請參閱記錄追蹤說明文件。

    系統追蹤
    圖 5. 系統追蹤

    按兩下圖表中可組合項,即可前往該原始碼。

  5. 您還可以在火焰圖中查看可組合項,以及檔案和行數:

    火焰圖
    圖 6. 火焰圖

注意事項

APK 大小負擔

雖然我們的目標是盡量減少功能負擔,但 Compose 編譯器追蹤 APK 內嵌的字串時,仍會導致 Compose 應用程式的 APK 大小增加。如果應用程式並未使用太多 Compose 或更大型的完整 Compose 應用程式,大小增幅相對就不會那麼大。這些追蹤字串會額外未經模糊處理,因此會出現在追蹤工具中,如前文所示。Compose 編譯器會從 1.3.0 版開始,將這些項目插入所有應用程式。

您可以新增下列 ProGuard 規則,在實際工作環境版本中移除追蹤字串:

-assumenosideeffects public class androidx.compose.runtime.ComposerKt {

   boolean isTraceInProgress();

   void traceEventStart(int,int,int,java.lang.String);

   void traceEventStart(int,java.lang.String);

   void traceEventEnd();

}

這些函式日後可能會變更,但 Compose 版本資訊中會說明所有變更。

請注意,保留這些 APK 並對 APK 大小造成些許影響,可確保要剖析的 APK 與應用程式使用者執行的 APK 相同。

準確計時

就像進行效能測試一樣,您必須根據可剖析的應用程式建構應用程式 profileablenon-debuggable,才能正確剖析。

從終端機擷取追蹤記錄

您可以從終端機擷取組合追蹤記錄。為此,您必須執行 Android Studio 平常為您自動執行的步驟。

新增依附元件

請先將其他依附元件新增至應用程式。

implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")

產生記錄指令

  1. 使用 Perfetto 產生記錄指令。
  2. 手動新增 track_event 資料來源區段,如以下範例所示:

    adb shell perfetto \
      -c - --txt \
      -o /data/misc/perfetto-traces/trace \
    <<EOF
    buffers: {
        size_kb: 63488
        fill_policy: RING_BUFFER
    }
    buffers: {
        size_kb: 2048
        fill_policy: RING_BUFFER
    }
    data_sources: {
        config {
            name: "track_event"
        }
    }
    duration_ms: 10000
    flush_period_ms: 30000
    incremental_state_config {
        clear_period_ms: 5000
    }
    EOF
    

擷取追蹤記錄

  1. 啟動應用程式,並準備您想追蹤的部分。
  2. 透過發布廣播,在應用程式中啟用追蹤功能。

    # set app package variable, e.g. com.google.samples.apps.nowinandroid.debug
    # can be found through `adb shell ps -ef` or `adb shell cmd package list packages`
    package=<your app process>
    
    # issue a broadcast to enable tracing
    adb shell am broadcast \
    -a androidx.tracing.perfetto.action.ENABLE_TRACING \
    $package/androidx.tracing.perfetto.TracingReceiver
    
  3. 啟動先前建立的錄製指令。

開啟追蹤記錄

  1. adb pull <location> 來自裝置的追蹤記錄 (記錄指令中指定的位置)。

  2. Perfetto 中開啟。

使用 Jetpack Macrobenchmark 擷取追蹤記錄

您可以使用 Jetpack Macrobenchmark 衡量效能,此做法會提供追蹤記錄做為結果。如要使用 Macrobenchmark 啟用組合追蹤,您需要:

  1. 將以下額外依附元件新增至 Macrobenchmark 測試模組:

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. 執行基準測試之前,請先新增 androidx.benchmark.fullTracing.enable=true 檢測引數。如要進一步瞭解 Macrobenchmark 檢測引數,請參閱「Macrobenchmark 檢測引數」。

意見回饋:

我們很樂意瞭解您對這項功能的意見回饋、發現的任何相關錯誤,以及任何要求。您可以透過Issue Tracker 將意見回饋傳送給我們。