Jeśli występują problemy z wydajnością spowodowane niepotrzebną lub nadmierną rekompozycją, musisz debugować stabilność aplikacji. W tym przewodniku opisujemy kilka metod, które Ci w tym pomogą.
Layout Inspector
Layout Inspector w Android Studio pozwala sprawdzić, które elementy kompozycyjne są ponownie komponowane w aplikacji. Wyświetla liczbę ponownych kompozycji lub pominięć komponentu przez Compose.

Raporty kompilatora Compose
Kompilator Compose może wyświetlać wyniki wnioskowania o stabilności. Na podstawie tych danych możesz określić, które elementy kompozycyjne można pominąć, a których nie. W kolejnych podsekcjach znajdziesz podsumowanie korzystania z tych raportów, ale więcej szczegółowych informacji znajdziesz w dokumentacji technicznej.
Konfiguracja
Raporty kompilatora Compose są domyślnie wyłączone. Możesz je aktywować za pomocą flagi kompilatora. Dokładna konfiguracja zależy od projektu, ale w przypadku projektów korzystających z wtyczki Gradle kompilatora Compose możesz dodać te informacje do pliku każdego modułu.build.gradle
android { ... }
composeCompiler {
reportsDestination = layout.buildDirectory.dir("compose_compiler")
metricsDestination = layout.buildDirectory.dir("compose_compiler")
}
Podczas kompilowania projektu będą teraz generowane raporty kompilatora Compose.
Przykładowe dane wyjściowe
W reportsDestination są zapisywane 3 pliki. Poniżej znajdziesz przykładowe dane wyjściowe
z JetSnack.
<modulename>-classes.txt: raport o stabilności klas w tym module. Przykład.<modulename>-composables.txt: raport o tym, jak elementy kompozycyjne w module można ponownie uruchamiać i pomijać. Przykład.<modulename>-composables.csv: wersja raportu o elementach kompozycyjnych w formacieCSV, którą możesz zaimportować do arkusza kalkulacyjnego lub przetworzyć za pomocą skryptu. Przykład
Raport o elementach kompozycyjnych
Plik composables.txt zawiera szczegółowe informacje o każdej funkcji kompozycyjnej w danym module, w tym o stabilności jej parametrów oraz o tym, czy można ją ponownie uruchamiać lub pomijać. Poniżej znajdziesz 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
)
Ten element kompozycyjny SnackCollection jest w pełni stabilny, można go ponownie uruchamiać i pomijać. Jest to na ogół preferowane, ale nie jest obowiązkowe.
Możesz też rozważyć inny przykład.
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ąć. Compose nigdy go nie pomija podczas rekompozycji. Dzieje się tak nawet wtedy, gdy żaden z jego parametrów nie uległ zmianie.
Powodem jest parametr unstable – snacks.
Raport o klasach
Plik classes.txt zawiera podobny raport o klasach w danym module. Poniższy fragment kodu to 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
}
Dla porównania podajemy definicję 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ł Snack jako niestabilny. Dzieje się tak, ponieważ typ
parametru tags to Set<String>. Jest to typ niezmienny, ponieważ nie jest to MutableSet. Jednak standardowe klasy kolekcji, takie jak Set, List i Map, są ostatecznie interfejsami. W związku z tym podstawowa implementacja może być nadal zmienna.
Możesz na przykład napisać val set: Set<String> = mutableSetOf("foo"). Zmienna jest stała, a jej zadeklarowany typ nie jest zmienny, ale jej implementacja nadal jest zmienna. Kompilator Compose nie może mieć pewności, że ta klasa jest niezmienna, ponieważ widzi tylko zadeklarowany typ. Dlatego oznacza tags jako niestabilny.