So hat Reddit den R8-Optimierer für erhebliche Leistungsverbesserungen eingesetzt
Lesezeit: 4 Minuten
In der heutigen Welt der mobilen Anwendungen ist eine nahtlose Nutzererfahrung nicht nur eine Funktion, sondern eine Notwendigkeit. Lange Ladezeiten, nicht reagierende Oberflächen und Instabilität können die Einbindung und Bindung von Nutzern erheblich beeinträchtigen. Bei der Zusammenarbeit mit dem Android Developer Relations-Team hat das Engineering-Team von Reddit den App Performance Score verwendet, um die App zu bewerten. Nach der Leistungsbewertung wurde ein erhebliches Verbesserungspotenzial festgestellt. Das Team beschloss, die erforderlichen Schritte zu unternehmen, um die volle Leistung von R8, dem Android-App-Optimierer, zu nutzen. Diese Initiative führte zu bemerkenswerten Verbesserungen bei den Startzeiten, zu weniger langsamen oder eingefrorenen Frames und ANR-Fehlern sowie zu einer allgemeinen Steigerung der Google Play Store-Bewertungen. In dieser Fallstudie wird aufgeschlüsselt, wie Reddit diese beeindruckenden Ergebnisse erzielt hat.
So hat der R8-Optimierer Reddit geholfen
Der R8-Optimierer ist ein grundlegendes Tool zur Leistungsoptimierung unter Android. Es sind verschiedene Schritte erforderlich, um die App-Leistung zu verbessern.Sehen wir uns die wichtigsten an.
- Tree Shaking ist der wichtigste Schritt, um die Größe einer App zu reduzieren. Dabei wird nicht verwendeter Code aus App-Abhängigkeiten und der App selbst entfernt.
- Beim Methoden-Inlining werden Methodenaufrufe durch den tatsächlichen Code ersetzt, wodurch die App leistungsfähiger wird.
- Klassenzusammenführung und andere Strategien werden angewendet, um den Code kompakter zu machen. An diesem Punkt geht es nicht mehr um die Lesbarkeit des Quellcodes, sondern darum, dass der kompilierte Code schnell funktioniert. Abstraktionen wie Schnittstellen oder Klassenhierarchien spielen hier also keine Rolle und werden entfernt.
- Bei der Kennungs-Minifizierung werden die Namen von Klassen, Feldern und Methoden in kürzere, bedeutungslose Namen geändert. Anstelle von
MyDataModelerhalten Sie dann möglicherweise die Klasse „a“. - Durch die Ressourcenreduzierung werden nicht verwendete Ressourcen wie XML-Dateien und Drawables entfernt, um die App-Größe weiter zu verringern.
Hauptphasen der R8-Optimierung
Von harten Daten zur Nutzerzufriedenheit: Erfolg in der Produktion ermitteln
Reddit konnte unmittelbar nach der Einführung einer neuen Version der App für Nutzer eine verbesserte Leistung verzeichnen.Mithilfe von Android Vitals und Crashlytics konnte Reddit Leistungsmesswerte auf echten Geräten mit tatsächlichen Nutzern erfassen und so die Neuveröffentlichung mit früheren Versionen vergleichen.
Wie R8 die App-Leistung von Reddit verbessert hat
Das Team stellte einen 40% schnelleren Kaltstart, eine 30% ige Reduzierung von „App antwortet nicht“-Fehlern, eine 25% ige Verbesserung beim Rendern von Frames und eine 14% ige Reduzierung der App-Größe fest.
Diese Verbesserungen sind entscheidend für die Nutzerzufriedenheit. Ein schnellerer Start bedeutet weniger Wartezeit und schnelleren Zugriff auf Inhalte. Weniger ANRs führen zu einer stabileren und zuverlässigeren App, was die Nutzerzufriedenheit steigert. Durch die flüssigere Frame-Wiedergabe wird das Ruckeln der Benutzeroberfläche reduziert, sodass sich Scrollen und Animationen flüssig und reaktionsschnell anfühlen. Diese positiven technischen Auswirkungen waren auch deutlich in der Nutzerstimmung zu erkennen.
Die Indikatoren für die Nutzerzufriedenheit, die den Erfolg der Optimierung belegen, waren direkt im Google Play Store sichtbar. Nach der Einführung der R8-optimierten Version stellten sie eine deutliche positive Veränderung bei der Nutzerstimmung und dem Nutzer-Engagement fest.
Drew Heavner: „Enabling R8's full potential tool less than 2 weeks“
Das ist umso beeindruckender, da es durch eine konzentrierte Anstrengung erreicht wurde. Drew Heavner, Staff Software Engineer bei Reddit, der an dieser Initiative mitgearbeitet hat, stellte fest, dass die Implementierung der Änderungen, um das volle Potenzial von R8 zu nutzen, weniger als zwei Wochen dauerte.
Leistungssteigerungen bestätigen: Makrobenchmarks im Detail
Nachdem das Engineering-Team von Reddit und das Android Developer Relations-Team von Google die erheblichen Verbesserungen in der Praxis beobachtet hatten, führten sie detaillierte Benchmarks durch, um die Verbesserungen wissenschaftlich zu bestätigen und mit weiteren Optimierungen zu experimentieren. Für diese Analyse stellte das Engineering-Team von Reddit zwei Versionen seiner App zur Verfügung: eine ohne Optimierungen und eine, in der R8 und zwei weitere grundlegende Tools zur Leistungsoptimierung angewendet wurden: Baseline-Profile und Startprofile.
Mit Baseline-Profilen werden die Just-in-time-Kompilierungsschritte (JIT) effektiv von Nutzergeräten auf Entwicklercomputer verlagert. Der generierte AOT-kompilierte Code (Ahead Of Time) hat sich als nützlich erwiesen, um sowohl die Startzeit als auch Rendering-Probleme zu reduzieren.
Wenn eine App verpackt wird, nimmt der d8-Dexer Klassen und Methoden und erstellt die classes.dex-Dateien Ihrer App. Wenn ein Nutzer die App öffnet, werden diese DEX-Dateien nacheinander geladen, bis die App gestartet werden kann. Wenn Sie ein Startprofil angeben, weiß d8, welche Klassen und Methoden in die ersten classes.dex-Dateien gepackt werden sollen. Durch diese Struktur kann die App weniger Dateien laden, was die Startgeschwindigkeit verbessert.
Jetpack Macrobenchmark war das wichtigste Tool in dieser Phase. Damit konnten Nutzerinteraktionen in einer kontrollierten Umgebung präzise gemessen werden. Um einen typischen Nutzerablauf zu simulieren, verwendeten sie die UIAutomator API, um einen Test zu erstellen, bei dem die App geöffnet, dreimal nach unten und dann wieder nach oben gescrollt wurde.
Am Ende war das alles, was zum Schreiben des Benchmarks erforderlich war:
uiAutomator {
startApp(REDDIT)
repeat(3) {
onView { isScrollable }.fling(Direction.DOWN) }
repeat(3) {
onView {isScrollable }.fling(Direction.UP)
}
}Die Benchmark-Daten bestätigten die Feldbeobachtungen und lieferten detailliertere Informationen. Die vollständig optimierte App startete 55% schneller und Nutzer konnten 18% früher mit dem Browsen beginnen. Die optimierte App wies außerdem eine um zwei Drittel geringere Anzahl von Just-in-Time-Kompilierungen (JIT) und eine um ein Drittel kürzere JIT-Kompilierungszeit auf. Das Rendering von Frames wurde verbessert, sodass im Vergleich zum Benchmark-Kaufprozess 19% mehr Frames gerendert wurden. Schließlich wurde die Größe der App um mehr als ein Drittel reduziert.
Verbesserungen der Gesamtleistung von Reddit
Sie können die Just-in-time-Kompilierung mit einem benutzerdefinierten Macrobenchmark-Messwert für den Trace-Abschnitt messen, wie hier gezeigt:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")Die Technologie hinter der Transformation aktivieren: R8
Wenn Sie R8 im vollständigen Modus aktivieren möchten, konfigurieren Sie die Datei app/build.gradle.kts, indem Sie minifyEnabled und shrinkResources im Release-Build-Typ auf true setzen.
android {
...
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"keep-rules.pro",
)
}
}
}Auf diesen Schritt muss ein ganzheitlicher End-to-End-Test folgen, da Leistungsoptimierungen zu unerwünschtem Verhalten führen können, das Sie besser erkennen, bevor Ihre Nutzer es tun.
Wie bereits weiter oben in diesem Artikel beschrieben, führt R8 umfangreiche Optimierungen durch, um die Leistungssteigerung zu maximieren. R8 nimmt erhebliche Änderungen am Code vor, z. B. durch Umbenennen, Verschieben und Entfernen von Klassen, Feldern und Methoden. Wenn Sie feststellen, dass diese Änderungen Fehler verursachen, müssen Sie angeben, welche Teile des Codes nicht von R8 geändert werden sollen. Dazu deklarieren Sie diese in Keep-Regeln.
Beispiel von Reddit in Ihrer App verwenden
Der Erfolg von Reddit mit R8 ist eine aussagekräftige Fallstudie für jedes Entwicklungsteam, das die Leistung seiner App mit geringem Aufwand deutlich verbessern möchte. Die direkte Korrelation zwischen den technischen Verbesserungen und dem anschließenden Anstieg der Nutzerzufriedenheit unterstreicht den Wert der Leistungsoptimierung.
Wenn andere Entwickler dem in dieser Fallstudie beschriebenen Konzept folgen und Tools wie den App Performance Score verwenden, um Optimierungsmöglichkeiten zu ermitteln, das volle Optimierungspotenzial von R8 nutzen, Daten aus der Praxis im Blick behalten und Benchmarks verwenden, um ihr Wissen zu bestätigen und zu vertiefen, können sie ähnliche Verbesserungen erzielen.
Hier finden Sie die aktualisierte offizielle Dokumentation und Anleitung zum Aktivieren, Konfigurieren und Beheben von Problemen mit dem R8-Optimierer.
-
FallstudienMonzo ist eine digitale Bank im Vereinigten Königreich mit 15 Millionen Kunden. Als die App skaliert wurde, stellte das Entwicklerteam fest, dass die Startzeit der App ein kritischer Bereich war, der verbessert werden musste. Sie befürchteten jedoch, dass dies erhebliche Änderungen an ihrer Codebasis erfordern würde.
Ben Weiss, Tracy Agyemang • 2 Minuten Lesezeit -
FallstudienDa die meisten Android-Apps Kotlin als Hauptsprache verwenden, sind kotlinx.coroutines zu einem De-facto-Standard für die asynchrone Programmierung geworden. Die Bibliothek bietet eine gut strukturierte Möglichkeit, gleichzeitige Flows zu verwalten, die nativ in Kotlin ist.
Jonathan Starup, Andrei Shikov • Lesezeit: 7 Minuten -
FallstudienLeistungsabfälle sind bekanntermaßen schwer zu reproduzieren, was sie zu einem großen Engpass für mobile Entwickler macht.
Alice Yuan, Arti Arutiunov, Nikita Ogorodnikov • Lesezeit: 4 Minuten
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.