Intensywny tryb pomijania

Silne pomijanie to tryb dostępny w kompilatorze. Gdy ta opcja jest włączona, zmienia działanie kompilatora na 2 sposoby:

  • Elementy składane z niestabilnymi parametrami stają się opcjonalne.
  • Funkcje lambda z niestabilnymi zapisami są zapamiętywane

Włączanie trybu ścisłego pomijania

Aby włączyć pomijanie w przypadku modułu Gradle w poprzedniej wersji, w bloku composeCompiler konfiguracji Gradle dodaj tę opcję:

android { ... }

composeCompiler {
   enableStrongSkippingMode = true
}

Możliwość pominięcia elementu kompozycyjnego

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ładającą się jako pomijaną, jeśli wszystkie jej argumenty mają stabilne wartości. Zmienia to stan silnego pomijania.

Gdy włączona jest opcja „Silne 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 pominąć

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.

  • Parametry niestabilne są porównywane z zastosowaniem równości instancji (===)
  • Parametry stabilne są porównywane z zastosowaniem równości obiektów (Object.equals())

Jeśli wszystkie parametry spełniają te wymagania, Compose pomija kompozyt podczas rekompozycji.

W funkcji kompozycyjnej możesz chcieć zrezygnować z silnego pomijania. 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 {}

Oznacz klasy jako stabilne

Jeśli zamiast równości instancji chcesz używać obiektu z równością obiektów, dodaj adnotacje do danej klasy za pomocą @Stable. Może to być na przykład konieczne przy obserwowaniu całej listy obiektów, a źródła danych, takie jak sala, przydzielają nowe obiekty do każdego elementu na liście za każdym razem, gdy zmienia się któraś z nich.

Zapisywanie w pamięci podręcznej w usłudze Lambda

Tryb pomijania z silną filtracją umożliwia też większą memoryzację funkcji lambda w komponowanych elementach. Po włączeniu silnego pomijania każda funkcja lambda w funkcji kompozycyjnej jest automatycznie zapamiętywana.

Przykłady

Aby osiągnąć zapamiętywanie lambda w ramach kompozytowych przy użyciu pomijania silnego, kompilator otacza funkcję lambda wywołaniem remember. Kluczem jest tutaj zapisy lambdy.

Weźmy pod uwagę przypadek, w którym używasz parametru lambda, jak w tym przykładzie:

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

Gdy włączone jest pomijanie z wysoką częstotliwością, 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 zasadom porównywania co funkcje kompozycyjne. Środowisko wykonawcze porównuje klucze niestabilne za pomocą równości instancji. Porównuje stabilne klucze za pomocą równości obiektów.

Zapamiętywanie i zmiana kompozycji

Ta optymalizacja znacznie zwiększa liczbę elementów kompozycyjnych, które są pomijane w środowisku wykonawczym podczas ponownej kompozycji. Bez zapamiętania informacji środowisko wykonawcze z większym prawdopodobieństwem przydzieli nową funkcję lambda do każdego elementu kompozycyjnego, który podczas zmiany kompozycji ma parametr lambda. W rezultacie nowa funkcja lambda ma parametry, które nie są równe parametrom ostatniej kompozycji. Spowoduje to zmianę kompozycji.

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. Po włączeniu silnego pomijania kompilator oznacza prawie wszystkie elementy kompozycyjne jako możliwe do pominięcia i umieszcza wszystkie elementy lambda w elemencie remember{...}. Z tego powodu włączenie silnego 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.