Güçlü Atlama, Oluşturma derleyicisinde bulunan bir moddur. Etkinleştirildiğinde derleyicinin davranışını iki şekilde değiştirir:
- Kararsız parametreleri olan bileşenler atlanabilir hale gelir.
- Kararsız yakalama içeren lambdalar hatırlanır
Güçlü atlama modunu etkinleştirme
Güçlü atlama, Kotlin 2.0.20'de varsayılan olarak etkindir.
2.0.20'den önceki bir sürümdeki Gradle modülü için güçlü atlama özelliğini etkinleştirmek isterseniz Gradle yapılandırmanızın composeCompiler
bloğuna aşağıdaki seçeneği ekleyin:
android { ... }
composeCompiler {
enableStrongSkippingMode = true
}
Kompozit atlanabilirlik
Güçlü atlama modu, atlama ve birleştirilebilir işlevler söz konusu olduğunda Compose derleyicisi tarafından normalde uygulanan istikrar kurallarının bazılarını gevşetir. Compose derleyicisi, varsayılan olarak tüm bağımsız değişkenlerinin sabit değerlere sahip olduğu bir birleştirilebilir işlevi atlanabilir olarak işaretler. Güçlü atlama modu bunu değiştirir.
Güçlü atlama etkinleştirildiğinde, yeniden başlatılabilen tüm birleştirilebilir işlevler atlanabilir hale gelir. Bu durum, kararsız parametreler olup olmadığına bakılmaksızın geçerlidir. Yeniden başlatılamayan composable işlevler atlanabilir değildir.
Ne zaman atlamalısınız?
Oluşturma, yeniden oluşturma sırasında bir bileşenin 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ığı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 koşulları karşılıyorsa Oluştur, yeniden oluşturma sırasında derlenebilir öğeyi atlar.
Güçlü atlama özelliğini devre dışı bırakmak için bir bileşen kullanabilirsiniz. Yani yeniden başlatılabilir ancak atlanabilir olmayan bir bileşen oluşturmak isteyebilirsiniz. Bu durumda @NonSkippableComposable
ek açıklamasını kullanın.
@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}
Sınıfları kararlı olarak işaretleme
Örnek eşitliği yerine nesne eşitliği kullanan bir nesne istiyorsanız ilgili sınıfı @Stable
ile notlandırmaya devam edin.
Bunu yapmanız gerekebilecek bir örnek, bir nesne listesinin tamamını gözlemlemektir. Room gibi veri kaynakları, bunlardan biri değiştiğinde listedeki her öğe için yeni nesneler ayırır.
Lambda hafızalandırma
Güçlü atlama modu, birleştirilebilirler içindeki lambdaların daha fazla hafızaya kaydedilmesini de sağlar. Güçlü atlama etkinleştirildiğinde, birleştirilebilir işlev içindeki her lambda otomatik olarak hatırlanır.
Örnekler
Güçlü atlama kullanılırken birleştirilebilirler içindeki lambda'ların hafızaya kaydedilmesi için derleyici, lambda'nızı bir remember
çağrısıyla sarar. Lambda'nın yakalamalarıyla anahtarlanır.
Aşağıdaki örnekte gösterildiği gibi bir lambda'ya sahip olduğunuzu varsayalım:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = {
use(unstableObject)
use(stableObject)
}
}
Güçlü atlama etkinleştirildiğinde derleyici, lambda'yı bir remember
çağrısına sarmalayarak hafızaya alır:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = remember(unstableObject, stableObject) {
{
use(unstableObject)
use(stableObject)
}
}
}
Anahtarlar, birleştirilebilir işlevlerle aynı karşılaştırma kurallarına uyar. Çalışma zamanı, kararsız anahtarları örnek eşitliğini kullanarak karşılaştırır. Nesne eşitliğini kullanarak kararlı anahtarları karşılaştırır.
Hatırlama ve yeniden derleme
Bu optimizasyon, çalışma zamanında yeniden derleme sırasında atlanan bileşen sayısını büyük ölçüde artırır. Hatırlama olmadan, çalışma zamanında, yeniden derleme sırasında lambda parametresi alan herhangi bir bileşene yeni bir lambda atanması çok daha olasıdır. Sonuç olarak, yeni lambda son kompozisyona eşit olmayan parametrelere sahiptir. Bu durum, yeniden kompozisyona neden olur.
Hatırlama özelliğini kullanmaktan kaçının
Hatırlamak istemediğiniz bir lambda işleviniz varsa @DontMemoize
ek açıklamasını kullanın.
val lambda = @DontMemoize {
...
}
APK Boyutu
Atlanabilir Composable'lar derlendiğinde, atlanabilir olmayan Composable'lara kıyasla daha fazla kod oluşturulur. Güçlü atlama etkinleştirildiğinde derleyici, neredeyse tüm derlenebilir öğeleri atlanabilir olarak işaretler ve tüm lambdaları bir remember{...}
içine sarar. Bu nedenle, güçlü atlama modunu etkinleştirmek, uygulamanızın APK boyutunu çok az etkiler.
Android'de güçlü atlama özelliğini etkinleştirmek, APK boyutunu 4 KB artırdı. Boyuttaki fark büyük ölçüde, ilgili uygulamada daha önce bulunan atlanabilir olmayan bileşenlerin sayısına bağlıdır ancak nispeten küçük olmalıdır.