如果發生效能問題,原因包括: 過度重組,您應該對應用程式的穩定性進行偵錯。本指南 概述幾種達成此目標的方法。
版面配置檢查器
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
不穩定。