Fallstudien
Wie Reddit den R8-Optimierer für erhebliche Leistungssteigerungen eingesetzt hat
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. Das Engineering-Team von Reddit arbeitete mit dem Android Developer Relations-Team zusammen und nutzte den App Performance Score, um die App zu bewerten. Nach der Leistungsbewertung stellten sie fest, dass es erhebliches Verbesserungspotenzial gab, und beschlossen, die notwendigen 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, einer Verringerung von langsamen oder eingefrorenen Frames und ANR-Fehlern sowie einer allgemeinen Steigerung der Google Play Store-Bewertungen. In dieser Fallstudie wird aufgeschlüsselt, wie Reddit diese beeindruckenden Ergebnisse erzielt hat.
Wie der R8-Optimierer Reddit geholfen hat
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 Method-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 Kennzeichner-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.
Wichtige Phasen 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 Leistungssteigerung 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 (ANR), 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 werden Ruckler auf der Benutzeroberfläche vermieden, 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 stellte das Team eine deutliche positive Veränderung bei Nutzerstimmung und ‑interaktionen 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
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 hat das Engineering-Team von Reddit zwei Versionen seiner App bereitgestellt: 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, da es eine genaue Messung von Nutzerinteraktionen in einer kontrollierten Umgebung ermöglichte. 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 Beobachtungen vor Ort und lieferten detailliertere Informationen. 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 Reduzierung der Just-in-Time-Kompilierung (JIT) um zwei Drittel und eine Verkürzung der JIT-Kompilierungszeit um ein Drittel festgestellt. Das Frame-Rendering wurde verbessert, sodass im Vergleich zum Benchmark-Nutzerpfad 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 R8 nicht ändern soll. Dazu deklarieren Sie diese in Keep-Regeln.
Beispiel von Reddit in Ihrer App übernehmen
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. Der direkte Zusammenhang 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 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.
Wenn Sie R8 in Ihrer eigenen App verwenden möchten, finden Sie in der aktualisierten offiziellen Dokumentation und Anleitung Informationen zum Aktivieren, Konfigurieren und Beheben von Problemen mit dem R8-Optimierer.
Weiterlesen
-
Fallstudien
Monzo ist eine britische Digitalbank 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 ihrem Code erfordern würde.
Ben Weiss • Lesezeit: 2 Minuten
-
Fallstudien
TikTok ist eine globale Plattform für Kurzvideos, die für ihre große Nutzerbasis und innovativen Funktionen bekannt ist.
Ben Trengrove, Ajesh Pai • Lesezeit: 2 Minuten
-
Fallstudien
In der dynamischen Welt der sozialen Medien lässt sich die Aufmerksamkeit der Nutzer schnell gewinnen oder verlieren. Meta-Apps (Facebook und Instagram) gehören zu den weltweit größten sozialen Plattformen und werden von Milliarden Nutzern auf der ganzen Welt verwendet.
Mayuri Khinvasara Khabya • Lesezeit: 4 Minuten
Auf dem Laufenden bleiben
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.