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

Gereksiz veya aşırı yeniden oluşturmadan kaynaklanan performans sorunları yaşıyorsanız uygulamanızın kararlılığında hata ayıklamanız gerekir. Bu kılavuzda, bunu yapmak için kullanabileceğiniz çeşitli yöntemler açıklanmaktadır.

Layout Inspector

Android Studio'daki Layout Inspector, uygulamanızda hangi composable'ların yeniden oluşturulduğunu görmenizi sağlar. Compose'un bir bileşeni kaç kez yeniden oluşturduğunu veya atladığını gösterir.

Layout Inspector'da yeniden oluşturma ve atlama sayıları

Compose derleyici raporları

Compose derleyici, kararlılık çıkarımının sonuçlarını inceleme için çıkarabilir. Bu çıkışı kullanarak hangi composable'larınızın atlanabilir, hangilerinin atlanamaz 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

Oluşturma derleyici raporları varsayılan olarak etkin değildir. Bunları bir derleyici işaretiyle etkinleştirebilirsiniz. Tam kurulum projenize bağlı olarak değişir ancak Compose derleyici Gradle eklentisini kullanan projelerde her modülün build.gradle dosyasına aşağıdakileri ekleyebilirsiniz.

  android { ... }

  composeCompiler {
    reportsDestination = layout.buildDirectory.dir("compose_compiler")
    metricsDestination = layout.buildDirectory.dir("compose_compiler")
  }

Compose derleyici raporları artık projeniz derlenirken oluşturulacak.

Örnek çıkış

reportsDestination üç dosya çıktısı verir. Aşağıda JetSnack'ten örnek çıktılar verilmiştir.

  • <modulename>-classes.txt: Bu modüldeki sınıfların kararlılığıyla ilgili bir rapor. Örnek.
  • <modulename>-composables.txt: Modüldeki composable'ların ne kadar yeniden başlatılabilir ve atlanabilir olduğuyla ilgili bir rapor. Örnek.
  • <modulename>-composables.csv:Bir e-tabloya aktarabileceğiniz veya komut dosyası kullanarak işleyebileceğiniz composable raporunun CSV sürümü. Örnek

Composables raporu

composables.txt dosyası, parametrelerinin kararlılığı ve yeniden başlatılabilir veya atlanabilir olup olmadıkları da dahil olmak üzere, belirli bir modül için her composable işlevi ayrıntılı olarak açıklar. Aşağıda, JetSnack'ten 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 örnekte, SnackCollection öğesinin her parametresi stable olarak işaretlenmiştir. Bu nedenle Compose, her parametreyi yapısal eşitlik (Object.equals()) kullanarak karşılaştırır. stable parametreleri, basit değerler ve ucuz .equals() kontrolleri olan küçük, düz veri sınıfları için ideal olsa da koleksiyon tutan modelleri (ör. List<Snack> sarmalayan bir SnackCollection) stable olmaya zorlamak, Compose'un her yeniden oluşturma işleminde her öğe için .equals() yöntemini çağırmasına neden olur. Güçlü atlama modu etkinleştirildiğinde, koleksiyonları tutan modelleri unstable tutmak tercih edilir. Böylece Compose, bunları örnek eşitliğini (===) kullanarak karşılaştırır.

Alternatif olarak, güçlü atlama modu devre dışı bırakılarak oluşturulan başka bir örneği inceleyin:

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
)

Güçlü atlama modu devre dışı bırakıldığında (Kotlin 2.0.20'den önce), HighlightedSnacks composable'ı atlanamaz. Oluştur, yeniden oluşturma sırasında parametrelerinden hiçbiri değişmemiş olsa bile unstable parametresi snacks nedeniyle bu composable'ı hiçbir zaman atlamaz.

Güçlü atlama modu etkinleştirildiğinde (Kotlin 2.0.20 ve sonraki sürümlerde varsayılan olarak) HighlightedSnacks, skippable olarak işaretlenir ve Oluştur, örnek eşitliğini (===) kullanarak unstable parametresini snacks karşılaştırır. Sonuç olarak Oluştur, aynı List referansı iletilirse HighlightedSnacks'yi atlar ve yalnızca yeni ayrılmış bir List örneği iletilirse yeniden oluşturur.

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 çıkışı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 olarak, Snack tanımı aşağıda 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. MutableSet olmadığı için bu, sabit bir türdür. Ancak Set, List ve Map gibi standart koleksiyon sınıfları nihayetinde arayüzlerdir. Bu nedenle, temel uygulama hâlâ değiştirilebilir olabilir.

Örneğin, val set: Set<String> = mutableSetOf("foo") yazabilirsiniz. Değişken sabittir ve tanımlanan türü değiştirilemez ancak uygulaması hâlâ değiştirilebilir. 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.