Güçlü atlama modu

Güçlü Atlama, Compose derleyicisinde bulunan bir moddur. Etkinleştirildiğinde, derleyicinin davranışını iki şekilde değiştirir:

  • Kararsız parametreler içeren composable'lar atlanabilir hale gelir
  • Kararsız yakalamalara sahip lambdalar hatırlanır

Güçlü atlama modunu etkinleştir

Bir Gradle modülü için güçlü atlamayı etkinleştirmek için aşağıdaki seçeneği Gradle yapılandırmanızın composeCompiler bloğuna ekleyin:

composeCompiler {
   enableStrongSkipping = true
}

Oluşturulabilir atlanabilirlik

Güçlü atlama modu, atlama ve composable işlevleri açısından Compose derleyicisinin normalde uyguladığı kararlılık kurallarından bazılarını gevşetir. Varsayılan olarak, Compose derleyicisi tüm bağımsız değişkenlerinin sabit değerleri varsa composable işlevini atlanabilir olarak işaretler. Güçlü atlama modu bunu değiştirir.

Güçlü atlama özelliği etkinken yeniden başlatılabilir tüm composable işlevler atlanabilir hâle gelir. Bu durum, anahtar kelimelerin kararsız parametreleri olsa da olmasa da geçerlidir. Yeniden başlatılamayan composable işlevler atlanamaz.

Ne zaman atlanmalı?

Compose, yeniden oluşturma sırasında bir composable'ın atlanıp atlanmayacağını belirlemek için her parametrenin değerini önceki değerleriyle karşılaştırır. Karşılaştırma türü, parametrenin kararlılığına bağlıdır.

  • Kararsız parametreler örnek eşitliği kullanılarak karşılaştırılır (===)
  • Kararlı parametreler nesne eşitliği (Object.equals()) kullanılarak karşılaştırılır

Tüm parametreler bu gereksinimleri karşılıyorsa Compose yeniden oluşturma sırasında composable'ı atlar.

Güçlü atlamalardan kaçınmak için bir composable'ı tercih edebilirsiniz. Yani yeniden başlatılabilir ancak atlanamayan bir composable isteyebilirsiniz. Bu durumda, @NonSkippableComposable ek açıklamasını kullanın.

@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}

Sınıflara kararlı olarak ek açıklama ekle

Örnek eşitliği yerine nesne eşitliğini kullanan bir nesne istiyorsanız belirtilen sınıfa @Stable'ı belirten ek açıklama eklemeye devam edin. Bunu, nesne listesinin tamamını gözlemlerken gözlemlemeniz gereken durumlara örnek olarak, Room gibi veri kaynaklarının, bunlardan biri değiştiğinde listedeki her öğe için yeni nesneler atadığı durumlar verilebilir.

Lambda notları

Güçlü atlama modu, composable'ların içindeki lambdaların daha fazla ezberlenmesini sağlar. Güçlü atlama etkin olduğunda, composable bir işlev içindeki her lambda otomatik olarak hatırlanır.

Örnekler

Güçlü atlama kullanılırken composable'ların içinde lambda'ların hatırlanmasını sağlamak için derleyici, lambdanızı bir remember çağrısıyla sarmalar. Lambda yakalama işlemleri yapılıyor.

Aşağıdaki örnekte olduğu gibi, lambda'nızın bulunduğu bir durumu düşünün:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = {
        use(unstableObject)
        use(stableObject)
    }
}

Güçlü atlama etkin olduğunda derleyici, lambda'yı bir remember çağrısına sarmalayarak lambdayı not eder:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = remember(unstableObject, stableObject) {
        {
            use(unstableObject)
            use(stableObject)
        }
    }
}

Anahtarlar, composable işlevlerle aynı karşılaştırma kurallarını izler. Çalışma zamanı, örnek eşitliğini kullanarak kararsız anahtarları karşılaştırır. Sabit anahtarları nesne eşitliğini kullanarak karşılaştırır.

Not alma ve yeniden düzenleme

Bu optimizasyon, çalışma zamanının yeniden oluşturma sırasında atladığı composable'ların sayısını önemli ölçüde artırır. Notlandırma olmadan, çalışma zamanının yeniden oluşturma sırasında lambda parametresi alan herhangi bir composable'a yeni bir lambda ayırma olasılığı çok daha yüksektir. Sonuç olarak, yeni lambda son bileşime eşit olmayan parametrelere sahiptir. Bu, yeniden yapılanmayla sonuçlanır.

Not girmekten kaçının

Not almak istemediğiniz bir lambdanız varsa @DontMemoize notasyonunu kullanın.

val lambda = @DontMemoize {
    ...
}

APK Boyutu

Atlanabilir Composable'lar derlendiğinde, atlanamayan composable'lara kıyasla daha fazla kod üretilir. Güçlü atlama özelliği etkinleştirildiğinde derleyici neredeyse tüm composable'ları atlanabilir olarak işaretler ve tüm lambda'ları bir remember{...} içinde sarmalar. Bu nedenle, güçlü atlama modunu etkinleştirmenin, uygulamanızın APK boyutu üzerinde çok küçük bir etkisi vardır.

Now In Android uygulamasında güçlü atlama özelliğini etkinleştirmek, APK boyutunu 4 KB artırdı. Boyut farkı büyük ölçüde, daha önce belirtilen uygulamada bulunan ancak görece küçük olması gereken, daha önce atlanamayan composable'ların sayısına bağlıdır.