Messwerte für „Schreiben“ und „Aufrufen“ vergleichen

Jetpack Compose beschleunigt die UI-Entwicklung und verbessert die Android-Entwicklung. Allerdings kann sich das Hinzufügen von Compose zu einer vorhandenen App auf Messwerte wie APK-Größe, Build und Laufzeitleistung einer App auswirken.

APK-Größe und Build-Zeiten

In diesem Abschnitt werden die Auswirkungen auf die APK-Größe und die Build-Dauer beschrieben. Dazu sehen Sie sich die Beispiel-App Sunflower an. Diese App veranschaulicht Best Practices für die Migration einer Ansichtsbasierten App zu Compose.

APK-Größe

Wenn Sie Ihrem Projekt Bibliotheken hinzufügen, wird das APK größer. Die folgenden Ergebnisse beziehen sich auf das reduzierte Release-APK jedes Projekts, bei dem die Ressourcen- und Codereduzierung aktiviert ist und der R8-Full-Modus verwendet und mit dem APK Analyzer gemessen wurde.

Lesemodus Gemischte Ansichten und Erstellung Nur Schreiben
Größe des Downloads 2.252 KB 3.034 KB 2.966 KB

Beim ersten Hinzufügen von Compose zu Sunflower wurde die APK-Größe von 2.252 KB auf 3.034 KB erhöht – eine Steigerung um 782 KB. Das generierte APK bestand aus dem UI-Build mit einer Mischung aus "Ansichten" und "Schreiben". Dieser Anstieg ist zu erwarten, da zu „Sunflower“ zusätzliche Abhängigkeiten hinzugefügt wurden.

Umgekehrt verringerte sich bei der Migration von Sunflower zu einer App, die ausschließlich zur Erstellung gehört, die APK-Größe von 3.034 KB auf 2.966 KB, was einer Reduzierung von 68 KB entspricht. Dieser Rückgang ist auf das Entfernen nicht verwendeter View-Abhängigkeiten wie AppCompat und ConstraintLayout zurückzuführen.

Build-Zeit

Wenn Sie Compose hinzufügen, erhöht sich die Build-Zeit Ihrer Anwendung, da der Compose-Compiler zusammensetzbare Funktionen in der Anwendung verarbeitet. Die folgenden Ergebnisse wurden mit dem eigenständigen Tool gradle-profiler erzielt, das einen Build mehrmals ausführt, damit eine durchschnittliche Build-Zeit für die Debug-Build-Dauer von Sunflower ermittelt werden kann:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Lesemodus Gemischte Ansichten und Erstellung Nur Schreiben
Durchschnittliche Build-Dauer 299,47 ms 399,09 ms 342,16 ms

Beim ersten Hinzufügen von Compose zu Sunflower stieg die mittlere Build-Dauer von 299 ms auf 399 ms – eine Steigerung um 100 ms. Dies ist darauf zurückzuführen, dass der Compose-Compiler zusätzliche Aufgaben ausführt, um den im Projekt definierten Compose-Code zu transformieren.

Umgekehrt sank die mittlere Build-Zeit auf 342 ms, eine Verringerung von 57 ms, nachdem die Migration von Sunflower zu Compose abgeschlossen wurde. Diese Reduzierung kann auf mehrere Faktoren zurückzuführen sein, die zusammen die Build-Zeit reduzieren. Dazu gehören das Entfernen von Datenbindung, das Migrieren von Abhängigkeiten, die kapt zu KSP verwenden, und die Aktualisierung mehrerer Abhängigkeiten auf die neuesten Versionen.

Zusammenfassung

Wenn du Compose einführst, erhöht sich dadurch die APK-Größe deiner App effektiv. Außerdem wird durch den Kompilierungsprozess des Compose-Codes die Leistung beim Erstellen der App gesteigert. Diese Abwägungen müssen jedoch gegen die Vorteile von Compose abwägen, insbesondere im Hinblick auf die Produktivitätssteigerung von Entwicklern durch die Einführung von Compose. Das Play Store-Team hat beispielsweise festgestellt, dass für das Schreiben von UI viel weniger Code erforderlich ist (teilweise bis zu 50%), wodurch die Produktivität und Verwaltbarkeit des Codes steigt.

Weitere Fallstudien finden Sie unter Neue Funktion in Teams verwenden.

Laufzeitleistung

In diesem Abschnitt werden Themen zur Laufzeitleistung in Jetpack Compose behandelt, um zu verstehen, wie Jetpack Compose mit der Leistung des View-Systems abschneidet und wie Sie sie messen können.

Intelligente Neuzusammensetzungen

Wenn Teile der UI ungültig sind, wird in der Funktion „Compose“ versucht, nur die zu aktualisierenden Teile neu zusammenzusetzen. Weitere Informationen finden Sie in der Dokumentation zu Lebenszyklus von zusammensetzbaren Funktionen und Jetpack Compose-Phasen.

Baseline-Profile

Baseline-Profile sind eine hervorragende Möglichkeit, häufige Nutzerpfade zu beschleunigen. Durch das Einbinden eines Baseline-Profils in Ihre Anwendung kann die Geschwindigkeit der Codeausführung ab dem ersten Start um etwa 30% verbessert werden, da Interpretations- und JIT-Kompilierungsschritte für enthaltene Codepfade vermieden werden.

Die Jetpack Compose-Bibliothek enthält ein eigenes Baseline-Profil. Diese Optimierungen werden automatisch vorgenommen, wenn Sie Compose in Ihrer Anwendung verwenden. Diese Optimierungen wirken sich jedoch nur auf Codepfade innerhalb der Compose-Bibliothek aus. Daher empfehlen wir Ihnen, ein Baseline-Profil in Ihre App einzufügen, um Codepfade außerhalb von Compose abzudecken.

Vergleich mit dem View-System

Jetpack Compose hat gegenüber dem View-System viele Verbesserungen. Diese Verbesserungen werden in den folgenden Abschnitten beschrieben.

Alles erweitert die Ansicht

Für jeden View, der auf dem Bildschirm verwendet wird, z. B. TextView, Button oder ImageView, sind Arbeitsspeicherzuweisungen, eine explizite Statusverfolgung und verschiedene Callbacks erforderlich, um alle Anwendungsfälle zu unterstützen. Darüber hinaus muss der benutzerdefinierte View-Inhaber explizite Logik implementieren, um zu verhindern, dass Daten neu gezeichnet werden, wenn dies nicht erforderlich ist, z. B. bei wiederholter Datenverarbeitung.

Jetpack Compose behebt dieses Problem auf unterschiedliche Weise. Es gibt keine expliziten aktualisierbaren Objekte für Zeichnungen. UI-Elemente sind einfache zusammensetzbare Funktionen, deren Informationen auf wiederholbare Weise in die Komposition geschrieben werden. Dadurch werden die explizite Statusverfolgung, Arbeitsspeicherzuweisungen und Callbacks auf die zusammensetzbaren Funktionen reduziert, die diese Features benötigen, anstatt sie für alle Erweiterungen eines bestimmten View-Typs zu benötigen.

Darüber hinaus können Sie mit der Funktion intelligente Neuzusammensetzungen erstellen. Dabei wird das zuvor gezeichnete Ergebnis noch einmal abgespielt, wenn Sie keine Änderungen vornehmen müssen.

Mehrere Layoutkarten

Herkömmliche ViewGroups haben eine hohe Ausdruckskraft in ihren Maß- und Layout-APIs, wodurch sie anfällig für mehrere Layoutdurchläufe sind. Diese mehrfachen Layoutdurchläufe können zu exponentiellen Arbeiten führen, wenn sie an bestimmten verschachtelten Punkten in der Ansichtshierarchie ausgeführt werden.

Jetpack Compose erzwingt über seinen API-Vertrag einen einzigen Layout-Pass für alle zusammensetzbaren Layout-Elemente. So können tiefe UI-Baumstrukturen in Compose effizient verarbeitet werden. Wenn mehrere Messungen erforderlich sind, verfügt Compose über intrinsische Messungen.

Startleistung ansehen

Das View-System muss XML-Layouts aufblähen, wenn ein bestimmtes Layout zum ersten Mal angezeigt wird. Diese Kosten werden in Jetpack Compose eingespart, da Layouts in Kotlin geschrieben und wie der Rest Ihrer App kompiliert werden.

Benchmark Compose

In Jetpack Compose 1.0 gibt es erhebliche Unterschiede zwischen der Leistung einer Anwendung in den Modi debug und release. Für repräsentative Zeiten sollten Sie bei der Profilerstellung für Ihre Anwendung immer den Build release anstelle von debug verwenden.

Mit der Jetpack MacroBenchmark-Bibliothek können Sie die Leistung des Jetpack Compose-Codes überprüfen. Informationen zur Verwendung mit Jetpack Compose finden Sie unter MacroBenchmarkSample-Projekt.

Das Jetpack Compose-Team verwendet außerdem MacroBenchmark, um mögliche Regressionen abzufangen. Informationen zum Nachverfolgen von Regressionen finden Sie beispielsweise in der Benchmark für Lazy-Spalte und im zugehörigen Dashboard.

Profilinstallation erstellen

Da es sich bei Jetpack Compose um eine entbündelte Bibliothek handelt, bietet Zygote keine Vorteile. Damit werden die UI-Toolkit-Klassen und Drawables des Ansichtssystems vorab geladen. Jetpack Compose 1.0 nutzt die Profilinstallation für Release-Builds. Mit Profilinstallationen können Apps kritischen Code angeben, der bei der Installation vorab kompiliert werden soll. Compose enthält Installationsregeln für das Profil, die die Startzeit und Verzögerungen in Compose-Anwendungen reduzieren.