„Strong Skipping“ ist ein Modus, der im Compose-Compiler verfügbar ist. Wenn diese Option aktiviert ist, ändert sich das Verhalten des Compilers auf zwei Arten:
- Zusammensetzbare Elemente mit instabilen Parametern werden überspringbar
- Lambdas mit instabilen Erfassungen werden gemerkt
Modus für starkes Überspringen aktivieren
Wenn Sie das Überspringen für ein Gradle-Modul in einem früheren Release aktivieren möchten, fügen Sie die folgende Option in den composeCompiler
-Block Ihrer Gradle-Konfiguration ein:
android { ... }
composeCompiler {
enableStrongSkippingMode = true
}
Zusammensetzbare Überspringbarkeit
Im Modus „Starkes Überspringen“ werden einige der Stabilitätsregeln gelockert, die normalerweise vom Compose-Compiler für übersprungene und kombinierbare Funktionen angewendet werden. Standardmäßig kennzeichnet der Compose-Compiler eine kombinierbare Funktion als überspringbar, wenn alle ihre Argumente stabile Werte haben. Das ändert sich mit dem Modus „Starkes Überspringen“.
Wenn die Option „Starkes Überspringen“ aktiviert ist, werden alle neustartbaren zusammensetzbaren Funktionen überspringbar. Das gilt unabhängig davon, ob die Parameter instabil sind oder nicht. Nicht neustartbare zusammensetzbare Funktionen können nicht übersprungen werden.
Wann kann ich Inhalte überspringen?
Um zu bestimmen, ob ein Composeable bei der Neuzusammensetzung übersprungen werden soll, vergleicht Compose den Wert jedes Parameters mit den vorherigen Werten. Die Art des Vergleichs hängt von der Stabilität des Parameters ab.
- Instabilitäten werden anhand der Instanzgleichheit (
===
) verglichen. - Stabile Parameter werden mithilfe der Objektgleichheit (
Object.equals()
) verglichen.
Wenn alle Parameter diese Anforderungen erfüllen, wird die zusammensetzbare Funktion bei der Neuzusammensetzung übersprungen.
Du kannst für ein Composed-Element festlegen, dass es nicht übersprungen werden kann. Das heißt, Sie möchten möglicherweise ein wiederstartbares, aber nicht überspringbares Composeable. Verwenden Sie in diesem Fall die Annotation @NonSkippableComposable
.
@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}
Klassen als stabil kennzeichnen
Wenn Sie für ein Objekt die Objektgleichheit anstelle der Instanzgleichheit verwenden möchten, annotieren Sie die entsprechende Klasse weiterhin mit @Stable
.
Das kann beispielsweise der Fall sein, wenn Sie eine ganze Liste von Objekten beobachten. Datenquellen wie Room weisen dann jedes Mal, wenn sich eines der Objekte ändert, jedem Element in der Liste neue Objekte zu.
Lambda-Memorisierung
Der starke Überspringen-Modus ermöglicht außerdem eine bessere Speicherung von Lambdas in zusammensetzbaren Funktionen. Wenn die Funktion „Starkes Überspringen“ aktiviert ist, wird jedes Lambda in einer kombinierbaren Funktion automatisch gespeichert.
Beispiele
Damit Lambdas in zusammensetzbaren Funktionen gespeichert werden, wenn ein starker Überspringen verwendet wird, umschließt der Compiler die Lambda-Funktion mit einem remember
-Aufruf. Sie ist mit den Aufnahmen der Lambda verknüpft.
Stellen Sie sich einen Fall vor, bei dem Sie eine Lambda-Funktion haben, wie im folgenden Beispiel:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = {
use(unstableObject)
use(stableObject)
}
}
Wenn die Funktion „Starkes Überspringen“ aktiviert ist, speichert der Compiler die Lambda-Funktion, indem er sie in einen remember
-Aufruf einbettet:
@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
val lambda = remember(unstableObject, stableObject) {
{
use(unstableObject)
use(stableObject)
}
}
}
Die Schlüssel folgen denselben Vergleichsregeln wie zusammensetzbare Funktionen. Die Laufzeitumgebung vergleicht instabile Schlüssel anhand der Instanzgleichheit. Dabei werden stabile Schlüssel anhand der Objektgleichheit verglichen.
Erinnerung und Neuzusammensetzung
Durch diese Optimierung wird die Anzahl der Composeables, die die Laufzeit beim Neuzusammenstellen überspringt, erheblich erhöht. Ohne Memoisierung ist es bei der Laufzeit viel wahrscheinlicher, dass jedem Composeable, das einen Lambda-Parameter annimmt, bei der Neuzusammensetzung ein neues Lambda zugewiesen wird. Daher hat die neue Lambda-Funktion Parameter, die nicht mit der letzten Zusammensetzung übereinstimmen. Dies führt zu einer Neuzusammensetzung.
Vermeiden Sie die Memoisierung.
Wenn Sie ein Lambda haben, das nicht zwischengespeichert werden soll, verwenden Sie die Anmerkung @DontMemoize
.
val lambda = @DontMemoize {
...
}
APK-Größe
Bei der Kompilierung führen überspringbare Composables zu mehr generiertem Code als nicht überspringbare Composables. Wenn die Option „Starkes Überspringen“ aktiviert ist, markiert der Compiler fast alle zusammensetzbaren Funktionen als überspringbar und fasst alle Lambdas in einem remember{...}
zusammen. Daher hat die Aktivierung des Modus für das Überspringen von Werbung nur einen sehr geringen Einfluss auf die APK-Größe Ihrer Anwendung.
Durch die Aktivierung der Funktion „Starkes Überspringen“ unter Jetzt bei Android ist die APK-Größe um 4 KB gestiegen. Die Größenunterschiede hängen weitgehend von der Anzahl der zuvor nicht überspringbaren Composeables ab, die in der jeweiligen App vorhanden waren. Sie sollten jedoch relativ gering sein.