Stabilitätsprobleme diagnostizieren

Wenn Leistungsprobleme aufgrund unnötiger oder zu viele Neuzusammensetzungen aufweist, sollten Sie die Stabilität Ihrer App debuggen. Dieser Leitfaden werden verschiedene Methoden hierfür beschrieben.

Layout Inspector

Mit dem Layout Inspector in Android Studio sehen Sie, welche zusammensetzbaren Funktionen in Ihrer App neu erstellen. Hier wird angezeigt, wie oft die Funktion „Schreiben“ neu zusammengesetzt oder übersprungen.

Anzahl der Neuzusammensetzungen und Überspringungen im Layout Inspector

Compiler-Berichte erstellen

Der Compose-Compiler kann die Ergebnisse seiner Stabilitätsinferenz für Inspektion. Anhand dieser Ausgabe können Sie bestimmen, welche Ihrer zusammensetzbaren Funktionen überspringbar und welche nicht. In den folgenden Unterabschnitten wird die Verwendung dieser Funktionen zusammengefasst: Ausführlichere Informationen finden Sie in den technischen Dokumentation.

Einrichten

Das Erstellen von Compiler-Berichten ist standardmäßig nicht aktiviert. Sie können sie mit Compiler-Flag. Die genaue Einrichtung hängt davon ab, Projekt erstellen. Für Projekte mit dem Composer-Plug-in für Gradle können Sie Folgendes tun: Fügen Sie in jeder build.gradle-Datei der Module Folgendes hinzu.

  android { ... }

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

Die Funktion „Compiler-Berichte“ wird jetzt beim Erstellen deines Projekts generiert.

Beispielausgabe:

reportsDestination gibt drei Dateien aus. Hier einige Beispiele für Ausgaben von JetSnack

  • <modulename>-classes.txt:Ein Bericht zur Stabilität der Klassen in diesem -Modul. Beispiel:
  • <modulename>-composables.txt:Ein Bericht dazu, wie neustartfähig und Überspringbar sind die zusammensetzbaren Funktionen im Modul. Beispiel:
  • <modulename>-composables.csv:CSV-Version des Berichts zu zusammensetzbaren Funktionen die Sie in eine Tabellenkalkulation importieren oder mit einem Skript verarbeiten können. Beispiel

Bericht „Zusammensetzbare Elemente“

In der Datei composables.txt sind alle zusammensetzbaren Funktionen für die angegebene des Moduls, einschließlich der Stabilität der Parameter, neustartbar oder überspringbar sind. Hier sehen Sie ein hypothetisches Beispiel 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
)

Diese SnackCollection-Zusammensetzbare Funktion ist vollständig neustartfähig, überspringbar und stabil sein. Dies ist im Allgemeinen vorzuziehen, aber nicht zwingend erforderlich.

Betrachten wir andererseits ein weiteres Beispiel.

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
)

Die zusammensetzbare Funktion „HighlightedSnacks“ kann nicht übersprungen werden. Beim Schreiben wird der Text nie übersprungen bei der Neuzusammensetzung. Dies geschieht auch dann, wenn sich keiner der Parameter geändert hat. Der Grund dafür ist der unstable-Parameter snacks.

Bericht „Kurse“

Die Datei classes.txt enthält einen ähnlichen Bericht über die Klassen im gegebenen -Modul. Das folgende Snippet ist die Ausgabe für die Klasse 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
}

Hier ist die Definition von Snack:

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

Der Compiler Compose hat Snack als instabil markiert. Das liegt daran, dass die Art der Der tags-Parameter ist Set<String>. Dies ist ein unveränderlicher Typ, ist kein MutableSet. Standardsammlungsklassen wie Set, List, und Map sind letztendlich Schnittstellen. Daher kann die zugrunde liegende Implementierung immer noch änderbar sein.

Sie könnten beispielsweise val set: Set<String> = mutableSetOf("foo") schreiben. Die konstant und ihr deklarierter Typ ist nicht veränderbar, -Implementierung weiterhin veränderbar ist. Der Compose-Compiler kann nicht sicher sein, unveränderlich ist, da sie nur den deklarierten Typ sieht. Daher markiert sie tags als instabil.