首次探究效能問題時,追蹤記錄通常是最佳資訊來源。追蹤記錄可用於擬定假設,並決定該從何處著手。
Android 支援兩種層級的追蹤:系統追蹤和方法追蹤。
系統追蹤只會追蹤標示要追蹤的範圍,因此負擔較低,不會對應用程式效能造成太大影響。系統追蹤是很實用的功能,可協助您查看程式碼特定區段的執行時間。
方法追蹤會追蹤應用程式中的每個函式呼叫。這種做法成本非常高昂,因此對應用程式的效能有很大影響,但可讓您全面掌握實際情況,以及所呼叫的函式和呼叫頻率。
根據預設,系統追蹤不會包含個別可組合函式。在方法追蹤中可以使用。
我們目前正在測試新的系統追蹤功能,以顯示系統追蹤中的可組合函式。這種方法可以兼顧系統追蹤的低度干擾,以及組合內方法追蹤層級的詳細資料。
設定組合追蹤
如要試用專案中的重組追蹤功能,您至少須更新到下列版本:
- Android Studio Flamingo
- Compose UI:1.3.0
- Compose Compiler: 1.3.0
執行追蹤的裝置或模擬器的最低 API 級別為 30。
此外,您需要在 Compose 執行階段追蹤中新增依附元件:
implementation("androidx.compose.runtime:runtime-tracing:1.7.5")
如果您使用的是 Compose BOM,則不需要指定版本:
val composeBom = platform("androidx.compose:compose-bom:2024.10.01")
implementation(composeBom)
// ...
// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")
透過這個依附元件,當您使用包含重組的系統追蹤時,就會自動看到可組合函式。
進行系統追蹤
如要進行系統追蹤,並查看新重組追蹤的實際運作情形,請按照下列步驟操作:
開啟分析器:
按一下「CPU 時間軸」
操作應用程式前往要追蹤的 UI,然後依次選取「System Trace」和「Record」
使用應用程式以引起重組及停止記錄。追蹤記錄處理完畢並且顯示之後,應該就能在重組追蹤中看到可組合項。您可以使用鍵盤和滑鼠,在追蹤記錄周圍縮放及平移。如果不清楚如何導覽追蹤記錄,請參閱記錄追蹤說明文件。
按兩下圖表中可組合項,即可前往該原始碼。
您還可以在火焰圖中查看可組合項,以及檔案和行數:
注意事項
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 相同。
準確計時
就像進行效能測試一樣,您必須根據可剖析的應用程式建構應用程式 profileable
和 non-debuggable
,才能正確剖析。
從終端機擷取追蹤記錄
您可以從終端機擷取組合追蹤記錄。為此,您必須執行 Android Studio 平常為您自動執行的步驟。
新增依附元件
請先將其他依附元件新增至應用程式。
implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
產生記錄指令
- 使用 Perfetto 產生記錄指令。
按照下方範例手動新增
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
擷取追蹤記錄
- 啟動應用程式,並準備好您想追蹤的部分。
透過發布廣播,在應用程式中啟用追蹤功能。
# 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
啟動先前建立的錄製指令。
開啟追蹤記錄
adb pull <location>
來自裝置的追蹤記錄 (記錄指令中指定的位置)。在 Perfetto 中開啟。
使用 Jetpack Macrobenchmark 擷取追蹤記錄
您可以使用 Jetpack Macrobenchmark 評估效能,該工具會以追蹤記錄做為結果。如要使用 Macrobenchmark 啟用組合追蹤,您需要:
將這些額外依附元件新增至 Macrobenchmark 測試模組:
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
在執行基準測試之前,新增
androidx.benchmark.fullTracing.enable=true
檢測引數。如要進一步瞭解 Macrobenchmark 檢測引數,請參閱「Macrobenchmark 檢測引數」。
意見回饋
我們很樂意瞭解您對這項功能的意見回饋、發現的任何相關錯誤,以及任何要求。您可以透過Issue Tracker 傳送意見回饋給我們。