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

Jetpack Compose beschleunigt die UI-Entwicklung und verbessert die Android-Entwicklung. Du solltest aber berücksichtigen, wie sich das Hinzufügen von „Compose“ zu einer vorhandenen App auf Messwerte wie die APK-Größe, den Build und die Laufzeitleistung einer App auswirken kann.

APK-Größe und Build-Dauer

In diesem Abschnitt werden die Auswirkungen auf die APK-Größe und die Build-Zeit anhand der Beispiel-App Sunflower beschrieben. Diese App enthält Best Practices für die Migration einer ansichtsbasierten App zu Compose.

APK-Größe

Wenn du deinem Projekt Bibliotheken hinzufügst, wird das APK größer. Die folgenden Ergebnisse gelten für das reduzierte Release-APK jedes Projekts, bei dem die Ressourcen- und Codeschrumpfung aktiviert ist, unter Verwendung des R8-Modus "Voll" und mit APK Analyzer gemessen.

Lesemodus Gemischte Ansichten und Kompositionen Schreibgeschützt
Größe des Downloads 2.252 KB 3.034 KB 2.966 KB

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

Wenn Sunflower hingegen zu einer reinen Schreib-App migriert wurde, verringerte sich die APK-Größe von 3.034 KB auf 2.966 KB – das entspricht 68 KB einer Reduzierung. Dieser Rückgang ist auf das Entfernen nicht verwendeter Abhängigkeiten von Datenansichten 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 Ihrer Anwendung verarbeitet. Die folgenden Ergebnisse wurden mit dem eigenständigen gradle-profiler-Tool abgerufen, das einen Build mehrmals ausführt, sodass die 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 Kompositionen Schreibgeschützt
Durchschnittliche Build-Dauer 299,47 ms 399,09 ms 342,16 ms

Beim ersten Hinzufügen von Compose in Sunflower wurde die durchschnittliche Build-Zeit von 299 ms auf 399 ms erhöht – also 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 durchschnittliche Build-Zeit auf 342 ms, was eine Verkürzung von 57 ms darstellt, als die Migration von Sunflower zu Compose abgeschlossen war. Diese Reduzierung kann auf verschiedene Faktoren zurückzuführen sein, die die Build-Zeit insgesamt reduzieren, z. B. das Entfernen der Datenbindung, die Migration von Abhängigkeiten, die kapt zu KSP verwenden, und das Aktualisieren mehrerer Abhängigkeiten auf ihre neuesten Versionen.

Zusammenfassung

Wenn Sie „Compose“ verwenden, erhöht sich aufgrund des Kompilierungsprozesses des Compose-Codes effektiv die APK-Größe Ihrer App und die Build-Dauer Ihrer App. Diese Kompromisse müssen jedoch gegen die Vorteile von Compose abgewogen werden, insbesondere im Hinblick auf die Steigerung der Entwicklerproduktivität bei der Verwendung von Compose. Das Play Store-Team hat beispielsweise herausgefunden, dass das Schreiben einer UI viel weniger Code erfordert, manchmal bis zu 50%, wodurch die Produktivität und Verwaltbarkeit des Codes gesteigert werden.

Weitere Fallstudien finden Sie unter Compose für Teams verwenden.

Laufzeitleistung

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

Intelligente Neuzusammensetzungen

Wenn Teile der UI ungültig sind, versucht Compose, nur die Teile neu zusammenzusetzen, die aktualisiert werden müssen. Weitere Informationen finden Sie in der Dokumentation zum Lebenszyklus von zusammensetzbaren Funktionen und zu den Phasen der Jetpack Compose-Phase.

Referenzprofile

Referenzprofile sind eine hervorragende Möglichkeit, gängige Nutzerpfade zu beschleunigen. Wenn Sie Ihrer Anwendung ein Baseline-Profil hinzufügen, können Sie die Geschwindigkeit der Codeausführung ab dem ersten Start um etwa 30% verbessern, da keine Interpretation und JIT-Kompilierungsschritte für enthaltene Codepfade ausgeführt werden müssen.

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

Vergleich mit dem Datenansichtssystem

Jetpack Compose hat im Vergleich zum Ansichtssystem viele Verbesserungen. Diese Verbesserungen werden in den folgenden Abschnitten beschrieben.

Alles erweitert die Ansicht

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

Jetpack Compose bietet mehrere Möglichkeiten, dieses Problem zu beheben. Compose enthält keine explizit aktualisierbaren Objekte zum Zeichnen von Ansichten. 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 erfordern.

Darüber hinaus bietet „Compose“ intelligente Neuzusammensetzungen, bei denen das zuvor gezeichnete Ergebnis wiedergegeben wird, wenn keine Änderungen erforderlich sind.

Mehrere Layout-Pässe

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

Jetpack Compose erzwingt über seinen API-Vertrag einen einzelnen Layout-Pass für alle zusammensetzbaren Layouts. Auf diese Weise kann Compose tiefe UI-Strukturen effizient verarbeiten. Wenn mehrere Messungen erforderlich sind, bietet Compose intrinsische Messungen.

Startleistung ansehen

Das View-System muss XML-Layouts künstlich in die Höhe treiben, wenn ein bestimmtes Layout zum ersten Mal angezeigt wird. Diese Kosten fallen in Jetpack Compose ein, da Layouts in Kotlin geschrieben und wie der Rest Ihrer App kompiliert werden.

Benchmarkerstellung

In Jetpack Compose 1.0 gibt es erhebliche Unterschiede zwischen der Leistung einer Anwendung im debug- und release-Modus. Verwenden Sie für repräsentative Zeiten immer den Build release anstelle von debug, wenn Sie ein Profil für Ihre Anwendung erstellen.

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

Das Jetpack Compose-Team verwendet außerdem MacroBenchmark, um mögliche Regressionen zu erkennen. Sehen Sie sich beispielsweise die Benchmark für verzögerte Spalten und das Dashboard an, um Regressionen zu verfolgen.

Installation des Profils erstellen

Da Jetpack Compose eine entbündelte Bibliothek ist, profitiert sie nicht von Zygote, das die UI Toolkit-Klassen und Drawables des View-Systems vorab lädt. Jetpack Compose 1.0 verwendet die Profilinstallation für Release-Builds. Profilinstallationsprogramme ermöglichen es Apps, kritischen Code anzugeben, der bei der Installation im Voraus kompiliert werden muss. Compose liefert Installationsregeln für Profile, die die Startzeit und Verzögerungen in Compose-Anwendungen reduzieren.