Jika Anda mengalami masalah performa yang disebabkan oleh rekomposisi yang tidak perlu atau berlebihan, Anda harus men-debug stabilitas aplikasi Anda. Panduan ini menguraikan beberapa metode untuk melakukannya.
Layout Inspector
Layout Inspector di Android Studio memungkinkan Anda melihat composable mana yang direkomposisi di aplikasi Anda. Alat ini menampilkan jumlah berapa kali Compose telah merekomposisi atau melewati komponen.
Laporan compiler Compose
Compiler Compose dapat menampilkan hasil inferensi stabilitasnya untuk diperiksa. 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 kode berikut di file build.gradle
setiap modul.
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
Laporan kompilator Compose kini akan dibuat saat membangun project Anda.
Contoh output
reportsDestination
menghasilkan tiga file. Berikut adalah contoh output
dari JetSnack.
<modulename>-classes.txt
: Laporan tentang stabilitas class dalam modul ini. Contoh.<modulename>-composables.txt
: Laporan tentang seberapa dapat dimulai ulang dan dilewati composable dalam modul. Contoh.<modulename>-composables.csv
:VersiCSV
laporan composable yang dapat Anda impor ke spreadsheet atau diproses menggunakan skrip. Contoh
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 hipotetis 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
)
Composable SnackCollection
ini dapat dimulai ulang sepenuhnya, dapat dilewati, dan
stabil. Cara ini umumnya lebih disukai, meskipun tentu saja tidak wajib.
Di sisi lain, mari kita lihat contoh lainnya.
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
)
Composable HighlightedSnacks
tidak dapat dilewati. Compose tidak pernah melewatinya
selama rekomposisi. Hal ini terjadi meskipun tidak ada parameter yang berubah.
Penyebabnya adalah parameter unstable
, snacks
.
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 bahwa
bukan MutableSet
. Namun, class koleksi standar seperti Set
,
List
, dan Map
pada akhirnya adalah antarmuka. Oleh karena itu, penerapan
yang mendasarinya mungkin masih dapat diubah.
Misalnya, Anda dapat menulis val set: Set<String> = mutableSetOf("foo")
. Variabel
bersifat konstan dan jenis yang dideklarasikan tidak dapat diubah, tetapi
implementasinya masih dapat diubah. Compiler Compose tidak dapat memastikan keabadian kelas ini karena hanya melihat jenis yang dideklarasikan. Oleh karena itu, tags
ditandai sebagai tidak stabil.