Diagnozowanie problemów ze stabilnością

W przypadku problemów ze skutecznością wynikających ze zbyt duże zmiany kompozycji, należy debugować stabilność aplikacji. Ten przewodnik Google podaje kilka metod.

Narzędzie do inspekcji układu

Inspektor układów w Android Studio pozwala sprawdzić, które elementy kompozycyjne i ponowne kompilowanie treści w aplikacji. Wyświetla liczbę przypadków ponownie skomponował lub pominął komponent.

Liczby zmian kompozycji i pominięć w inspektorze układu

Raporty kompilatora tworzenia wiadomości

Kompilator Compose może zwrócić wyniki wnioskowania dotyczącego stabilności inspekcja. Na podstawie tych danych wyjściowych możesz określić, które z elementów kompozycyjnych możliwe do pominięcia, a które nie. Poniżej podsumowujemy, jak korzystać z tych funkcji. raportów, ale bardziej szczegółowe informacje można znaleźć w sekcji dotyczącej dokumentacji.

Konfiguracja

Raporty kompilatora Compose nie są domyślnie włączone. Możesz je aktywować za pomocą flagę kompilatora. Dokładna konfiguracja zależy od projektu, ale w przypadku projektów korzystających z wtyczki Gradle kompilatora Compose można dodaj następujące elementy w każdym pliku build.gradle modułów.

  android { ... }

  composeCompiler {
    reportsDestination = layout.buildDirectory.dir("compose_compiler")
    metricsDestination = layout.buildDirectory.dir("compose_compiler")
  }

Raporty kompilatora Compose będą teraz generowane podczas tworzenia projektu.

Przykładowe dane wyjściowe

Na wyjściu reportsDestination są 3 pliki. Poniżej znajdziesz przykładowe dane wyjściowe od JetSnack.

  • <modulename>-classes.txt: raport o stabilności zajęć w tym . Fragment.
  • <modulename>-composables.txt: raport na temat możliwości ponownego uruchomienia elementy kompozycyjne, które można pominąć. Fragment.
  • <modulename>-composables.csv: wersja raportu dotyczącego kompozycji (CSV) które można zaimportować do arkusza kalkulacyjnego lub przetworzyć za pomocą skryptu. Przykład
.

Raport Kompozycje

Plik composables.txt zawiera szczegółowe informacje o każdej funkcji kompozycyjnej dostępnej dla danego argumentu w tym stabilność ich parametrów oraz to, czy są one których nie da się pominąć lub które można pominąć. Oto hipotetyczny przykład z JetSnack:

restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun SnackCollection(
  stable snackCollection: SnackCollection
  stable onSnackClick: Function1<Long, Unit>
  stable modifier: Modifier? = @static Companion
  stable index: Int = @static 0
  stable highlight: Boolean = @static true
)

Tę kompozycję SnackCollection można w pełni ponownie uruchomić, pominąć stabilną. Zwykle jest to preferowane, ale nie jest obowiązkowe.

Z drugiej strony przyjrzyjmy się innemu przykładowi.

restartable scheme("[androidx.compose.ui.UiComposable]") fun HighlightedSnacks(
  stable index: Int
  unstable snacks: List<Snack>
  stable onSnackClick: Function1<Long, Unit>
  stable modifier: Modifier? = @static Companion
)

Elementu kompozycyjnego HighlightedSnacks nie można pominąć. Tworzenie wiadomości nigdy nie jest pomijane podczas ponownego komponowania. Dzieje się tak nawet wtedy, gdy żaden z ich parametrów się nie zmienił. Przyczyną takiego problemu jest parametr unstable (snacks).

Raport Zajęcia

Plik classes.txt zawiera podobny raport na temat klas w podanych . Ten fragment kodu zawiera dane wyjściowe klasy Snack:

unstable class Snack {
  stable val id: Long
  stable val name: String
  stable val imageUrl: String
  stable val price: Long
  stable val tagline: String
  unstable val tags: Set<String>
  <runtime stability> = Unstable
}

Oto definicja terminu Snack:

data class Snack(
    val id: Long,
    val name: String,
    val imageUrl: String,
    val price: Long,
    val tagline: String = "",
    val tags: Set<String> = emptySet()
)

Kompilator Compose oznaczył wersję Snack jako niestabilną. To dlatego, że typ tagu parametr tags ma wartość Set<String>. Jest to typ stały, ponieważ nie ma statusu MutableSet. Jednak standardowe klasy zbioru, takie jak Set, List, a Map to interfejsy. W związku z tym podstawowa implementacja może których nie można zmienić.

Możesz na przykład wpisać val set: Set<String> = mutableSetOf("foo"). jest stała, a jej zadeklarowany typ nie jest zmienny, implementacji można nadal zmieniać. Kompilator Compose nie może mieć pewności, niezmienność tej klasy, ponieważ widzi tylko zadeklarowany typ. W związku z tym oznacza tags jako niestabilny.