診斷穩定性問題

如果發生效能問題,原因包括: 過度重組,您應該對應用程式的穩定性進行偵錯。本指南 概述幾種達成此目標的方法。

版面配置檢查器

Android Studio 的版面配置檢查器可讓您查看 在應用程式中進行重組時其中會顯示 Compose 重組或略過元件

版面配置檢查器中的重組和略過次數

Compose 編譯器報表

Compose 編譯器可以輸出針對下列項目的穩定性推論結果: 以及檢查 10 到 100 個威脅您可以運用這個輸出內容判斷哪些可組合函式 可略過及否以下子章節將概述如何運用 但如需更多詳細資訊,請參閱技術工具 說明文件

設定

根據預設,Compose 編譯器報表不會啟用。你可以透過以下方式啟用 編譯器標記。確切設定會因您的 不過,對於使用 Compose 編譯器 Gradle 外掛程式的專案,您可以 在每個模組 build.gradle 檔案中新增以下程式碼。

  android { ... }

  composeCompiler {
    reportsDestination = layout.buildDirectory.dir("compose_compiler")
    metricsDestination = layout.buildDirectory.dir("compose_compiler")
  }

現在建構專案時,系統會產生 Compose 編譯器報表。

輸出內容範例

reportsDestination 會輸出三個檔案。以下是輸出內容範例 來自 JetSnack

  • <modulename>-classes.txt此報告會顯示此類別中類別穩定性的報告 後續課程我們將逐一介紹 預先訓練的 API、AutoML 和自訂訓練範例
  • <modulename>-composables.txt關於可重新啟動和 可略過的可組合函式模組。範例
  • <modulename>-composables.csv可組合元件報表的 CSV 版本 方便你匯入試算表,或透過指令碼處理 範例
,瞭解如何調查及移除這項存取權。

可組合函式報表

composables.txt 檔案會詳細列出指定應用程式的每個可組合函式 包括參數的穩定性 可重新啟動或可略過以下是 JetSnack

restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun SnackCollection(
  stable snackCollection: SnackCollection
  stable onSnackClick: Function1<Long, Unit>
  stable modifier: Modifier? = @static Companion
  stable index: Int = @static 0
  stable highlight: Boolean = @static true
)

這個 SnackCollection 可組合函式可完全重新啟動、可略過和 以及穩定的品質一般來說,我們會建議您這麼做,不過我們當然不是強制要求。

另一方面,我們還來看看另一個範例。

restartable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
  stable index: Int
  unstable snacks: List<Snack>
  stable onSnackClick: Function1<Long, Unit>
  stable modifier: Modifier? = @static Companion
)

HighlightedSnacks 可組合函式無法略過。Compose 絕對不會略過 重新組成期間即使其中的參數沒有變更,也會發生這種情形。 原因是 unstable 參數 snacks

課程報告

classes.txt 檔案內含與指定 後續課程我們將逐一介紹 預先訓練的 API、AutoML 和自訂訓練以下程式碼片段為 Snack 類別的輸出內容:

unstable class Snack {
  stable val id: Long
  stable val name: String
  stable val imageUrl: String
  stable val price: Long
  stable val tagline: String
  unstable val tags: Set<String>
  <runtime stability> = Unstable
}

以下是 Snack 的定義,供您參考:

data class Snack(
    val id: Long,
    val name: String,
    val imageUrl: String,
    val price: Long,
    val tagline: String = "",
    val tags: Set<String> = emptySet()
)

Compose 編譯器已將 Snack 標示為不穩定。這是因為 tags 參數為 Set<String>。這是不可變動的類型 不是 MutableSet。不過,Set, List 等標準的集合類別 和 Map 則是介面。因此,基礎實作可能會 仍可變動

例如,您可以編寫 val set: Set<String> = mutableSetOf("foo")。 變數是常數,且其宣告類型不可變動,但其 實作方式「仍」可變動。Compose 編譯器無法確定 這個類別的不可變動性,因為這個類別只會看到宣告的類型。因此會標示 tags 不穩定。