Intensywny tryb pomijania

Silne pomijanie to tryb dostępny w kompilatorze tworzenia wiadomości. Po włączeniu zmienia działanie kompilatora na 2 sposoby:

Włącz tryb silnego pomijania

Aby włączyć silne pomijanie w module Gradle, umieść tę opcję w bloku composeCompiler konfiguracji Gradle:

composeCompiler {
   enableStrongSkipping = true
}

Możliwość pominięcia

Silny tryb pomijania łagodzi niektóre reguły stabilności, które zwykle są stosowane przez kompilator Compose w przypadku funkcji pomijania i tworzenia. Domyślnie kompilator Compose oznacza funkcję kompozycyjną jako możliwą do pominięcia, jeśli wszystkie jej argumenty mają stabilne wartości. Tryb silnego pomijania zmienia to.

Po włączeniu silnego pomijania wszystkie możliwe do ponownego uruchomienia funkcje kompozycyjne można pominąć. Ma to zastosowanie niezależnie od tego, czy mają niestabilne parametry. Funkcji kompozycyjnych, których nie można ponownie uruchomić, nie można pominąć.

Kiedy pominąć

Aby określić, czy podczas zmiany kompozycji chcesz pominąć element kompozycyjny, funkcja Compose porównuje wartość każdego parametru z ich poprzednimi wartościami. Typ porównania zależy od stabilności parametru.

  • Porównujemy niestabilne parametry z wykorzystaniem równości instancji (===)
  • Parametry stabilne są porównywane za pomocą równości obiektów (Object.equals())

Jeśli wszystkie parametry spełniają te wymagania, funkcja Utwórz pomija element kompozycyjny podczas zmiany kompozycji.

Warto użyć funkcji kompozycyjnej, która pozwala zrezygnować z dużego pomijania. Może chcesz np. utworzyć funkcję kompozycyjną, którą można ponownie uruchomić, ale nie można jej pominąć. W takim przypadku użyj adnotacji @NonSkippableComposable.

@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}

Dodawanie adnotacji do klas jako stabilnej

Jeśli chcesz, aby obiekt używał równości obiektów zamiast równości instancji, nadal dodawaj adnotacje do danej klasy za pomocą @Stable. Może być to konieczne np. w przypadku obserwowania całej listy obiektów. Źródła danych takie jak Pokoje będą przydzielać nowe obiekty do każdego elementu na liście przy każdej zmianie.

Zapamiętywanie lambda

Silny tryb pomijania umożliwia też lepsze zapamiętywanie elementów lambda w elementach kompozycyjnych. Po włączeniu silnego pomijania każda lambda w funkcji kompozycyjnej zostanie automatycznie zapamiętana.

Przykłady

Aby zapamiętywać lambda w komponentach z użyciem silnego pomijania, kompilator opakowuje lambda wywołaniem remember. Jest on powiązany z rejestracjami lambda.

Przeanalizujmy przypadek, w którym znajduje się lambda, jak w tym przykładzie:

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

Po włączeniu silnego pomijania kompilator zapamiętuje lambda, pakują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ównania co funkcje kompozycyjne. Środowisko wykonawcze porównuje niestabilne klucze za pomocą równości instancji. Porównuje klucze stabilne za pomocą równości obiektu.

Zapamiętywanie i zmiana kompozycji

Ta optymalizacja znacznie zwiększa liczbę elementów kompozycyjnych, które środowisko wykonawcze pomija podczas zmiany kompozycji. Bez zapamiętywania jest większe prawdopodobieństwo, że środowisko wykonawcze przydzieli nową funkcję lambda do dowolnego elementu kompozycyjnego, który podczas rekompozycji przyjmuje parametr lambda. W efekcie nowa funkcja lambda ma parametry inne niż ostatnia kompozycja. Powoduje to zmianę kompozycji.

Unikaj zapamiętywania

Jeśli masz lambda, którego nie chcesz zapamiętywać, użyj adnotacji @DontMemoize.

val lambda = @DontMemoize {
    ...
}

Rozmiar pliku APK

Tak skompilowane komponenty kompozycyjne możliwe do pominięcia generują więcej kodu niż te, których nie da się pominąć. Po włączeniu silnego pomijania kompilator oznacza prawie wszystkie elementy kompozycyjne jako możliwe do pominięcia i opakowuje wszystkie lambda w elemencie remember{...}. Z tego powodu włączenie silnego trybu pomijania ma bardzo mały wpływ na rozmiar pliku APK aplikacji.

Włączenie silnego pomijania w aplikacji Now In Android zwiększyło rozmiar pliku APK o 4 kB. Różnica w rozmiarze zależy w dużej mierze od liczby elementów kompozycyjnych, których nie można wcześniej pominąć, które znajdowały się w danej aplikacji, ale powinny być stosunkowo niewielkie.