Jika Anda mengalami masalah performa yang disebabkan oleh rekomposisi yang tidak perlu atau berlebihan, Anda harus men-debug stabilitas aplikasi. Panduan ini menguraikan beberapa metode untuk melakukannya.
Layout Inspector
Layout Inspector di Android Studio memungkinkan Anda melihat composable mana yang direkomposisi di aplikasi. Alat ini menampilkan jumlah berapa kali Compose telah merekomposisi atau melewati komponen.

Laporan compiler Compose
Compiler Compose dapat menghasilkan hasil inferensi stabilitasnya untuk pemeriksaan. Dengan menggunakan output ini, Anda dapat menentukan composable mana yang dapat dilewati, dan mana yang tidak. Subbagian berikut merangkum cara menggunakan laporan ini, tetapi untuk informasi yang lebih mendetail, lihat dokumentasi teknis.
Penyiapan
Laporan compiler Compose tidak diaktifkan secara default. Anda dapat mengaktifkannya dengan
flag compiler. Penyiapan yang tepat bervariasi bergantung pada
project Anda, tetapi untuk project yang menggunakan plugin gradle compiler Compose, Anda dapat
menambahkan hal berikut di file build.gradle setiap modul.
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
Laporan compiler Compose kini akan dibuat saat mem-build project Anda.
Contoh output
reportsDestination menghasilkan tiga file. Berikut adalah contoh output
dari JetSnack.
<modulename>-classes.txt: Laporan tentang stabilitas class dalam modul ini. Sampel.<modulename>-composables.txt: Laporan tentang seberapa dapat dimulai ulang dan dilewati composable dalam modul. Sampel.<modulename>-composables.csv:VersiCSVlaporan composable yang dapat Anda impor ke spreadsheet atau diproses menggunakan skrip. Sampel
Laporan composable
File composables.txt menjelaskan setiap fungsi composable untuk modul tertentu, termasuk stabilitas parameternya, dan apakah fungsi tersebut dapat dimulai ulang atau dilewati. Berikut adalah contoh hipotesis dari
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
)
Dalam contoh ini, setiap parameter SnackCollection ditandai stable, sehingga
Compose membandingkan setiap parameter menggunakan kesetaraan struktural (Object.equals()).
Meskipun parameter stable ideal untuk nilai primitif dan class data kecil dan datar
dengan pemeriksaan .equals() yang murah, memaksa model penampung koleksi (seperti
SnackCollection yang menggabungkan List<Snack>) menjadi stable akan menyebabkan Compose
memanggil .equals() pada setiap item di setiap rekomposisi. Dengan mengaktifkan Mode
skipping kuat, sebaiknya pertahankan model yang menyimpan koleksi unstable
agar Compose membandingkannya menggunakan kesetaraan instance (===).
Atau, pertimbangkan contoh lain yang dibuat dengan Mode skipping kuat dinonaktifkan:
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
)
Jika mode skipping kuat dinonaktifkan (sebelum Kotlin 2.0.20), composable HighlightedSnacks tidak dapat dilewati—Compose tidak pernah melewatkannya selama
rekomposisi, meskipun tidak ada parameternya yang berubah, karena
parameter unstable snacks.
Dengan mengaktifkan Mode skipping kuat (default di Kotlin 2.0.20 dan
yang lebih baru), HighlightedSnacks ditandai sebagai skippable, dan Compose membandingkan
parameter unstable snacks menggunakan kesetaraan instance (===). Akibatnya,
Compose akan melewati HighlightedSnacks jika referensi List yang sama diteruskan, dan
hanya merekomposisinya jika instance List yang baru dialokasikan diteruskan.
Laporan kelas
File classes.txt berisi laporan serupa tentang class dalam modul
yang diberikan. Cuplikan berikut adalah output untuk class 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
}
Sebagai referensi, berikut adalah definisi Snack:
data class Snack(
val id: Long,
val name: String,
val imageUrl: String,
val price: Long,
val tagline: String = "",
val tags: Set<String> = emptySet()
)
Compiler Compose telah menandai Snack sebagai tidak stabil. Hal ini karena jenis
parameter tags adalah Set<String>. Ini adalah jenis yang tidak dapat diubah, mengingat ini
bukan MutableSet. Namun, class koleksi standar seperti Set,
List, dan Map pada akhirnya adalah antarmuka. Dengan demikian, implementasi yang mendasarinya mungkin masih dapat diubah.
Misalnya, Anda dapat menulis val set: Set<String> = mutableSetOf("foo"). Variabelnya konstan dan jenis yang dideklarasikan tidak dapat diubah, tetapi implementasinya tetap dapat diubah. Compiler Compose tidak dapat memastikan
ketetapan class ini karena hanya melihat jenis yang dideklarasikan. Oleh karena itu, Compose menandai
tags sebagai tidak stabil.