Gereksiz veya aşırı şekilde yeniden oluşturma işleminden kaynaklanan performans sorunları yaşıyorsanız uygulamanızın kararlılığındaki hataları ayıklamanız gerekir. Bu kılavuzda, bu işlemi gerçekleştirmenin çeşitli yöntemleri açıklanmaktadır.
Düzen Denetleyici
Android Studio'daki Düzen Denetleyicisi, uygulamanızda hangi composable'ların yeniden derlendiğini görmenize olanak tanır. Bu araç, Compose'un bir bileşeni kaç kez yeniden oluşturduğuna veya atladığına ilişkin sayıyı gösterir.
Derleyici raporları oluşturma
Compose derleyicisi, inceleme için kararlılık çıkarımının sonuçlarını oluşturabilir. Bu çıktıyı kullanarak composable'larınızdan hangilerinin atlanabilir ve hangilerinin atlanabilir olduğunu belirleyebilirsiniz. Aşağıdaki alt bölümlerde bu raporların nasıl kullanılacağı özetlenmektedir, ancak daha ayrıntılı bilgi için teknik belgelere bakın.
Kurulum
Derleyici derleyici raporları varsayılan olarak etkin değildir. Bunları derleyici işaretiyle
etkinleştirebilirsiniz. Tam kurulum, projenize bağlı olarak değişiklik gösterir ancak çoğu proje için aşağıdaki komut dosyasını kök build.gradle
dosyanıza yapıştırabilirsiniz.
Modern
subprojects {
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
kotlinOptions {
if (project.findProperty("composeCompilerReports") == "true") {
freeCompilerArgs += [
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" +
project.buildDir.absolutePath + "/compose_compiler"
]
}
if (project.findProperty("composeCompilerMetrics") == "true") {
freeCompilerArgs += [
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" +
project.buildDir.absolutePath + "/compose_compiler"
]
}
}
}
}
Kotlin
subprojects {
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
kotlinOptions {
if (project.findProperty("composeCompilerReports") == "true") {
freeCompilerArgs += listOf(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=${project.buildDir.absolutePath}/compose_compiler"
)
}
if (project.findProperty("composeCompilerMetrics") == "true") {
freeCompilerArgs += listOf(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=${project.buildDir.absolutePath}/compose_compiler"
)
}
}
}
}
Görevi çalıştırma
composable'larınızın kararlılığında hata ayıklamak için görevi aşağıdaki gibi çalıştırın:
./gradlew assembleRelease -PcomposeCompilerReports=true
Örnek çıkış
Bu görev üç dosya çıkarır. Aşağıda JetSnack'ten alınan örnek çıkışlar bulunmaktadır.
<modulename>-classes.txt
: Bu modüldeki sınıfların kararlılığı hakkında bir rapor. Örnek.<modulename>-composables.txt
: composable'ın modülde ne kadar yeniden başlatılabilir ve atlanabilir olduğuna dair bir rapor. Örnek.<modulename>-composables.csv
: e-tabloya veya komut dosyası kullanarak işlemeye aktarabileceğiniz composables raporununCSV
sürümü. Örnek
Oluşturulabilirler raporu
composables.txt
dosyası, belirli bir modüldeki her bir composable işlevini (parametrelerinin kararlılığı ve yeniden başlatılabilir mi yoksa atlanabilir mi oldukları dahil) ayrıntılarıyla belirtir. Aşağıda, JetSnack'ten alınan varsayımsal bir örnek verilmiştir:
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
)
Bu SnackCollection
composable'ı tamamen yeniden başlatılabilir, atlanabilir ve kararlıdır. Zorunlu olmasa da bu genellikle tercih edilir.
Öte yandan, başka bir örneğe bakalım.
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
composable atlanamaz. Oluşturma işlemi, yeniden oluşturma sırasında
hiçbir zaman atlamaz. Bu durum, parametrelerin hiçbiri değişmese bile gerçekleşir.
Bunun nedeni unstable
parametresidir (snacks
).
Sınıflar raporu
classes.txt
dosyası, belirtilen modüldeki sınıflarla ilgili benzer bir rapor içerir. Aşağıdaki snippet, Snack
sınıfının çıktısıdır:
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
}
Referans olması açısından, aşağıda Snack
tanımı verilmiştir:
data class Snack(
val id: Long,
val name: String,
val imageUrl: String,
val price: Long,
val tagline: String = "",
val tags: Set<String> = emptySet()
)
Compose derleyicisi Snack
öğesini kararsız olarak işaretledi. Bunun nedeni, tags
parametresinin türünün Set<String>
olmasıdır. Bu, MutableSet
olmadığı için sabit bir türdür. Ancak Set, List
ve Map
gibi standart koleksiyon sınıfları, nihai olarak arayüzlerdir. Bu nedenle, temel uygulama hâlâ değişebilir.
Örneğin, val set: Set<String> = mutableSetOf("foo")
yazabilirsiniz. Değişken sabittir ve bildirilen türü değişken değildir ancak uygulanması hâlâ değişebilir. Compose derleyicisi yalnızca bildirilen türü gördüğü için bu sınıfın değişmezliğinden emin olamaz. Bu nedenle tags
, kararsız olarak işaretlenir.