Silne pomijanie to tryb dostępny w kompilatorze Compose. Po włączeniu ta opcja zmienia działanie kompilatora na 2 sposoby:
- Elementy składane z niestabilnymi parametrami stają się opcjonalne.
- Lambda z niestabilnymi przechwyceniami są zapamiętywane.
Włączanie trybu ścisłego pomijania
Silne pomijanie jest domyślnie włączone w Kotlinie 2.0.20.
Aby umożliwić pomijanie modułu Gradle w wersji wcześniejszej niż 2.0.20, w bloku composeCompiler
konfiguracji Gradle dodaj tę opcję:
android { ... }
composeCompiler {
enableStrongSkippingMode = true
}
Możliwość pominięcia reklamy kompozycyjnej
Tryb pomijania z wysoką czułością łagodzi niektóre reguły stabilności, które są zwykle stosowane przez kompilator Compose w przypadku pomijania i funkcji składanych. Domyślnie kompilator usługi Compose oznacza funkcję składaną jako możliwą do pominięcia, jeśli wszystkie jej argumenty mają stabilne wartości. Tryb szybkiego pomijania zmienia to.
Gdy włączona jest opcja „Mocne pomijanie”, wszystkie funkcje kompozytowe, które można ponownie uruchomić, stają się pomijalne. Dotyczy to zarówno przypadków, gdy mają one niestabilne parametry, jak i takich, gdy ich nie mają. Niemożliwe do ponownego uruchomienia funkcje typu „composable” pozostają nieprzeskakywalne.
Kiedy pomijać
Aby określić, czy pominąć kompozyt podczas ponownego tworzenia, usługa Compose porównuje wartość każdego parametru z poprzednimi wartościami. Typ porównania zależy od stabilności parametru.
- Niestabilne parametry są porównywane za pomocą równości instancji (
===
). - Stabilne parametry są porównywane za pomocą funkcji porównywania obiektów (
Object.equals()
).
Jeśli wszystkie parametry spełniają te wymagania, Compose pomija kompozyt podczas rekompozycji.
Możesz użyć komponentu, aby wyłączyć silne pomijanie. Możesz chcieć użyć składanego elementu, który można wznowić, ale nie można pominąć. W takim przypadku użyj adnotacji @NonSkippableComposable
.
@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}
Oznaczanie klas jako stabilnych
Jeśli chcesz, aby obiekt używał równości obiektów zamiast równości instancji, kontynuuj adnotowanie danej klasy za pomocą @Stable
.
Możesz to zrobić na przykład wtedy, gdy obserwujesz całą listę obiektów. Źródła danych takie jak Room przydzielą nowe obiekty do każdego elementu na liście, gdy tylko jeden z nich ulegnie zmianie.
Zapisywanie w pamięci podręcznej w usłudze Lambda
Tryb pomijania z silną kompresją umożliwia też większą memoryzację funkcji lambda w komponowanych. Gdy włączona jest opcja pomijania funkcji, każda funkcja lambda w ramach funkcji składanej będzie automatycznie zapamiętywana.
Przykłady
Aby osiągnąć memoizację funkcji lambda wewnątrz kompozytów przy użyciu funkcji pomijania silnego, kompilator otacza funkcję lambda wywołaniem remember
. Jest ona powiązana z nagraniami z wyrażenia lambda.
Załóżmy, że masz funkcję lambda, która wygląda tak:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = {
use(unstableObject)
use(stableObject)
}
}
Gdy włączone jest pomijanie bezwzględne, kompilator zapamiętuje funkcję lambda, owijając ją w wywołanie remember
:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = remember(unstableObject, stableObject) {
{
use(unstableObject)
use(stableObject)
}
}
}
Klucze podlegają tym samym regułom porównywania co funkcje składane. Runtime porównuje klucze niestabilne za pomocą równości instancji. Porównuje klucze stabilne za pomocą równości obiektów.
Zapisywanie w pamięci podręcznej i rekompozycja
Ta optymalizacja znacznie zwiększa liczbę komponentów, które środowisko uruchomieniowe pomija podczas rekompozycji. Bez zapamiętywania w czasie wykonywania kodu jest znacznie bardziej prawdopodobne, że środowisko uruchomieniowe przydzieli nową funkcję lambda do każdego komponentu, który przyjmuje parametr lambda podczas rekompozycji. W rezultacie nowa funkcja lambda ma parametry, które nie są równe parametrom ostatniej kompozycji. Powoduje to zmianę składu.
Unikaj zapamiętywania
Jeśli masz funkcję lambda, której nie chcesz zapamiętywać, użyj adnotacji @DontMemoize
.
val lambda = @DontMemoize {
...
}
Rozmiar pliku APK
Po skompilowaniu kompozytowe elementy możliwe do pominięcia generują więcej kodu niż kompozytowe elementy niemożliwe do pominięcia. Gdy włączone jest pomijanie z wysoką skutecznością, kompilator oznacza prawie wszystkie komponenty jako możliwe do pominięcia i otula wszystkie funkcje lambda w ramach funkcji remember{...}
. W związku z tym włączenie trybu pomijania ma bardzo niewielki wpływ na rozmiar pliku APK aplikacji.
Włączenie funkcji pomijania w aplikacji Now In na Androidzie zwiększyło rozmiar pliku APK o 4 KB. Różnica w rozmiarze zależy głównie od liczby wcześniej nieprzeskakywalnych komponentów, które były obecne w danej aplikacji, ale powinny być stosunkowo niewielkie.