Kararlılık sorunlarını teşhis etme

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.

Düzen Denetleyicisi'nde yeniden oluşturma ve atlama sayıları

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 raporunun CSV 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.