Wie Reddit den R8-Optimizer für erhebliche Leistungsverbesserungen eingesetzt hat
Lesezeit: 4 Minuten
In der heutigen Welt der mobilen Apps ist eine nahtlose Nutzererfahrung nicht nur ein Feature, sondern eine Notwendigkeit. Lange Ladezeiten, nicht reagierende Oberflächen und Instabilität können erhebliche Hindernisse für die Nutzerinteraktion und -bindung darstellen. Das Engineering-Team von Reddit hat bei der Zusammenarbeit mit dem Android Developer Relations-Team den App Performance Score verwendet, um die Leistung seiner App zu bewerten. Nach der Bewertung der Leistung wurde ein erhebliches Verbesserungspotenzial festgestellt. Das Team beschloss, die notwendigen Schritte zu unternehmen, um das volle Potenzial von R8, dem Android-App-Optimizer, zu nutzen. Diese gezielte Initiative führte zu bemerkenswerten Verbesserungen bei den Startzeiten, zu weniger langsamen oder eingefrorenen Frames und ANRs sowie zu einer allgemeinen Steigerung der Bewertungen im Google Play Store. In dieser Fallstudie wird beschrieben, wie Reddit diese beeindruckenden Ergebnisse erzielt hat.
Wie der R8-Optimizer Reddit geholfen hat
Der R8-Optimizer ist ein grundlegendes Tool für die Leistungsoptimierung unter Android. Er führt verschiedene Schritte aus, um die Leistung von Apps zu verbessern.Sehen wir uns die wichtigsten an.
- Tree Shaking ist der wichtigste Schritt zur Reduzierung der Größe einer App. Dabei wird ungenutzter Code aus App-Abhängigkeiten und der App selbst entfernt.
- Bei der Methodeninlining werden Methodenaufrufe durch den tatsächlichen Code ersetzt, wodurch die Leistung der App verbessert 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 durch Menschen, sondern darum, dass kompilierter Code schnell funktioniert. Abstraktionen wie Schnittstellen oder Klassenhierarchien spielen hier keine Rolle und werden entfernt.
- Bei der Kennzeichner-Minifizierung werden die Namen von Klassen, Feldern und Methoden in kürzere, bedeutungslose Namen geändert. So kann aus
MyDataModelbeispielsweise eine Klasse mit dem Namen „a“ werden. - Bei der **Ressourcenreduzierung** werden ungenutzte Ressourcen wie XML-Dateien und Drawables entfernt, um die App-Größe weiter zu reduzieren.
Hauptphasen der R8-Optimierung
Von harten Daten zur Nutzerzufriedenheit: Erfolg in der Produktion erkennen
Bei Reddit wurden sofort nach der Einführung einer neuen Version der App für Nutzer Leistungsverbesserungen festgestellt.Mit Android Vitals und Crashlytics konnte Reddit Leistungsmesswerte auf echten Geräten mit echten Nutzern erfassen und so die Neuveröffentlichung mit früheren Versionen vergleichen.
Wie R8 die App-Leistung von Reddit verbessert hat
Das Team beobachtete einen 40% schnelleren Kaltstart, eine 30% ige Reduzierung der „App antwortet nicht“-Fehler (ANR), eine 25% ige Verbesserung des Frame-Renderings und eine 14% ige Reduzierung der App-Größe.
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 und reduzieren die Frustration der Nutzer. Ein reibungsloseres Frame-Rendering beseitigt UI-Verzögerungen, sodass das Scrollen und die Animationen flüssig und reaktionsschnell sind. Diese positiven technischen Auswirkungen waren auch in der Nutzerstimmung deutlich sichtbar.
Die Indikatoren für die Nutzerzufriedenheit mit dem Erfolg der Optimierung waren direkt im Google Play Store sichtbar. Nach der Einführung der R8-optimierten Version verzeichnete das Team eine drastische und positive Veränderung der Nutzerstimmung und -interaktion.
Drew Heavner: „Das volle Potenzial von R8 in weniger als zwei Wochen genutzt“
Am beeindruckendsten ist, dass dies mit einem gezielten Aufwand erreicht wurde. Drew Heavner, Staff Software Engineer bei Reddit, der an dieser Initiative gearbeitet hat, stellte fest, dass die Implementierung der Änderungen zur Nutzung des vollen Potenzials von R8 weniger als zwei Wochen gedauert hat.
Bestätigung der Verbesserungen: Eine detaillierte Analyse mit Makro-Benchmarks
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 weitere Optimierungen zu testen. Für diese Analyse stellte das Engineering-Team von Reddit zwei Versionen seiner App zur Verfügung: eine ohne Optimierungen und eine weitere, bei 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 den Nutzergeräten auf die Entwicklermaschinen verlagert. Der generierte AOT-kompilierte Code (Ahead Of Time) hat sich als geeignet erwiesen, sowohl die Startzeit als auch Rendering-Probleme zu reduzieren.
Wenn eine App verpackt wird, verwendet der D8-Dexer Klassen und Methoden und erstellt die classes.dex-Dateien der 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 wiederum die Startgeschwindigkeit verbessert.
Jetpack Macrobenchmark war das wichtigste Tool für diese Phase, da es eine genaue Messung der Nutzerinteraktionen in einer kontrollierten Umgebung ermöglicht. Um einen typischen Nutzerablauf zu simulieren, wurde mit der UIAutomator API ein Test erstellt, bei dem die App geöffnet, dreimal nach unten und dann wieder nach oben gescrollt wurde.
Am Ende war nur Folgendes erforderlich, um den Benchmark zu schreiben:
uiAutomator {
startApp(REDDIT)
repeat(3) {
onView { isScrollable }.fling(Direction.DOWN) }
repeat(3) {
onView {isScrollable }.fling(Direction.UP)
}
}Die Benchmark-Daten bestätigten die Beobachtungen in der Praxis und lieferten detailliertere Erkenntnisse. Die vollständig optimierte App startete 55% schneller und Nutzer konnten 18% früher mit dem Browsen beginnen. Bei der optimierten App wurde auch eine um zwei Drittel geringere Anzahl von Just-in-time-Kompilierungen (JIT) und eine um ein Drittel geringere JIT-Kompilierungszeit festgestellt. Das Frame-Rendering wurde verbessert, sodass 19% mehr Frames im Rahmen des Benchmark-Nutzerablaufs gerendert wurden. Schließlich wurde die Größe der App um mehr als ein Drittel reduziert.
Gesamtleistungsverbesserungen bei Reddit
Sie können die Just-in-time-Kompilierung mit einem benutzerdefinierten Macrobenchmark-Messwert für den Trace-Abschnitt wie folgt messen:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")Die Technologie hinter der Transformation: R8
Um R8 im vollständigen Modus zu aktivieren, 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 müssen umfassende End-to-End-Tests folgen, da Leistungsoptimierungen zu unerwünschtem Verhalten führen können, das Sie besser erkennen, bevor Ihre Nutzer es tun.
Wie bereits in diesem Artikel erwähnt, führt R8 umfangreiche Optimierungen durch, um die Leistungsvorteile zu maximieren. R8 nimmt erhebliche Änderungen am Code vor, einschließlich des Umbenennens, Verschiebens und Entfernens 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.
Das Beispiel von Reddit in Ihrer App nachahmen
Der Erfolg von Reddit mit R8 ist eine aussagekräftige Fallstudie für jedes Entwicklungsteam, das die Leistung seiner App mit geringem Aufwand erheblich verbessern möchte. Die direkte Korrelation zwischen den technischen Verbesserungen und der anschließenden Steigerung der Nutzerzufriedenheit unterstreicht den Wert der Leistungsoptimierung.
Wenn andere Entwickler dem in dieser Fallstudie beschriebenen Plan folgen – Tools wie den App Performance Score verwenden, um Möglichkeiten zu erkennen, das volle Optimierungspotenzial von R8 nutzen, Daten aus der Praxis beobachten und Benchmarks verwenden, um das Verständnis zu bestätigen und zu vertiefen – können sie ähnliche Verbesserungen erzielen.
Informationen zu den ersten Schritten mit R8 in Ihrer eigenen App finden Sie in der aktualisierten offiziellen Dokumentation und Anleitung zum Aktivieren, Konfigurieren und Beheben von Problemen mit dem R8-Optimizer.
-
FallstudienMonzo ist eine digitale Bank im Vereinigten Königreich mit 15 Millionen Kunden und steigender Tendenz. Mit zunehmender Größe der App stellte das Engineering-Team fest, dass die Startzeit der App ein kritischer Bereich für Verbesserungen war. Es befürchtete jedoch, dass erhebliche Änderungen an der Codebasis erforderlich wären.
Ben Weiss, Tracy Agyemang • Lesezeit: 2 Minuten -
FallstudienLeistungsregressionen 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 -
FallstudienFotMob verzeichnete kürzlich den größten Anstieg der Wear OS-Nutzung an einem einzigen Tag unter den installierten Nutzern seit fünf Jahren. Der Wert lag zwei- bis dreimal über dem Tagesdurchschnitt. Das Geheimnis? Ein einfacher geräteübergreifender Installationsablauf, mit dem Nutzer die Wear OS-App direkt von ihrem Smartphone aus finden können.
Garan Jenkin • Lesezeit: 3 Minuten
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.