Jika Anda mengalami masalah performa yang disebabkan oleh tindakan yang tidak perlu atau rekomposisi 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 rekomposisi di aplikasi Anda. Kolom ini menampilkan jumlah frekuensi Compose merekomposisi atau melewatkan komponen.
Laporan compiler Compose
Compiler Compose dapat menampilkan hasil inferensi stabilitasnya untuk pemeriksaan. Dengan menggunakan output ini, Anda dapat menentukan composable mana yang dapat diabaikan, dan yang tidak. Subbagian berikut meringkas cara menggunakannya tetapi untuk informasi yang lebih detail, lihat panduan dokumentasi tambahan.
Penyiapan
Laporan compiler Compose tidak diaktifkan secara default. Anda dapat mengaktifkannya dengan
penanda compiler. Penyiapan yang tepat bervariasi bergantung pada
tetapi untuk project yang menggunakan plugin gradle compiler Compose, Anda dapat
tambahkan kode berikut di setiap modul file build.gradle
.
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
Laporan compiler Compose kini akan dibuat saat membuat project Anda.
Contoh output
reportsDestination
menghasilkan tiga file. Berikut adalah contoh output
dari JetSnack.
<modulename>-classes.txt
: Laporan tentang stabilitas class dalam ruang lingkup modul ini. Contoh.<modulename>-composables.txt
: Laporan tentang seberapa dapat dimulai ulang dan composable yang dapat dilewati ada dalam modul. Contoh.<modulename>-composables.csv
:VersiCSV
laporan composable yang dapat diimpor ke dalam {i>spreadsheet<i} atau diproses menggunakan skrip. Contoh
Laporan composable
File composables.txt
menjelaskan setiap fungsi composable untuk elemen
termasuk stabilitas parameternya, dan apakah parameter tersebut
dapat dimulai ulang atau dapat dilewati. Berikut ini 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
)
Composable SnackCollection
ini dapat sepenuhnya dimulai ulang, dapat dilewati, dan
stabil. Umumnya hal ini lebih disukai, meskipun tentu saja tidak wajib.
Di sisi lain, mari kita lihat contoh lain.
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 parameternya yang berubah.
Alasannya adalah parameter unstable
, snacks
.
Laporan kelas
File classes.txt
berisi laporan serupa tentang class dalam
ruang lingkup modul ini. 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>
. Tipe ini tidak dapat diubah, mengingat bahwa
bukan MutableSet
. Namun, class koleksi standar seperti Set, List
,
dan Map
pada akhirnya adalah antarmuka. Dengan demikian, implementasi yang mendasarinya mungkin
masih dapat berubah.
Misalnya, Anda dapat menulis val set: Set<String> = mutableSetOf("foo")
. Tujuan
variabel bersifat konstan dan jenis yang dideklarasikannya tidak dapat berubah, tetapi
implementasinya masih dapat diubah. Compiler Compose tidak dapat memastikan
ketetapan class ini karena hanya melihat jenis yang dideklarasikan. Oleh karena itu, menandai
tags
sebagai tidak stabil.