Fallstudien

Wie Reddit mit dem R8-Optimierungstool die Leistung deutlich verbessert hat

Lesezeit: 4 Minuten
Profil von Ben Weiss ansehen
Ben Weiss Developer Relations Engineer

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 Nutzerinteraktion und ‑bindung erheblich beeinträchtigen. Während der Zusammenarbeit mit dem Android Developer Relations-Team hat das Engineering-Team von Reddit den App-Leistungswert verwendet, um die App zu bewerten. Nach der Bewertung der Leistung wurden erhebliche Verbesserungspotenziale festgestellt und es wurde beschlossen, die erforderlichen Schritte zu unternehmen, um die volle Leistung von R8, dem Android-App-Optimierer, zu nutzen. Diese gezielte Initiative führte zu bemerkenswerten Verbesserungen bei den Startzeiten, einer Reduzierung von langsamen oder eingefrorenen Frames und ANR-Fehlern sowie einer allgemeinen Verbesserung der Bewertungen im Google Play Store. In dieser Fallstudie wird erläutert, wie Reddit diese beeindruckenden Ergebnisse erzielt hat.

So hat der R8-Optimierer Reddit geholfen

Der R8-Optimierer ist ein grundlegendes Tool zur Leistungsoptimierung auf Android-Geräten. Es gibt verschiedene Möglichkeiten, 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. Hier wird nicht verwendeter Code aus App-Abhängigkeiten und der App selbst entfernt.
  • Beim Methoden-Inlining werden Methodenaufrufe durch den tatsächlichen Code ersetzt, was die Leistung der App verbessert.
  • Klassenzusammenführung und andere Strategien werden angewendet, um den Code kompakter zu machen. An dieser Stelle geht es nicht mehr um die Lesbarkeit des Quellcodes für Menschen, sondern darum, dass der kompilierte Code schnell funktioniert. Abstraktionen wie Schnittstellen oder Klassenhierarchien spielen hier also keine Rolle und werden entfernt.
  • Bei der Minimierung von Kennungen werden die Namen von Klassen, Feldern und Methoden in kürzere, bedeutungslose Namen geändert. Anstelle von MyDataModel erhalten Sie also möglicherweise eine Klasse namens „a“.
  • Durch die Entfernung von Ressourcen  werden nicht verwendete Ressourcen wie XML-Dateien und Drawables entfernt, um die App-Größe weiter zu reduzieren.
image.png

Hauptphasen der R8-Optimierung

Von harten Daten zur Nutzerzufriedenheit: Erfolg in der Produktion erkennen

Reddit konnte sofort nach der Einführung einer neuen Version der App eine verbesserte Leistung verzeichnen. Mithilfe von Android Vitals und Crashlytics konnte Reddit Leistungsmesswerte auf echten Geräten mit echten Nutzern erfassen und so das neue Release mit früheren Versionen vergleichen.

image.png

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 Frame-Rendering 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 ANR-Fehler bedeuten eine stabilere und zuverlässigere App und weniger Frust bei den Nutzern. Durch ein flüssigeres Frame-Rendering werden UI-Ruckler vermieden, sodass Scrollen und Animationen flüssig und reaktionsschnell wirken. Diese positiven technischen Auswirkungen spiegelten sich auch deutlich in der Stimmung der Nutzer wider.

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 dramatische und positive Veränderung der Nutzerstimmung und des Nutzerengagements fest.

image.png

Drew Heavner: „Es hat weniger als zwei Wochen gedauert, das volle Potenzial von R8 auszuschöpfen.“

Besonders beeindruckend ist, dass dies mit einer gezielten Maßnahme erreicht wurde. Drew Heavner, der Staff Software Engineer bei Reddit, der an dieser Initiative mitgearbeitet hat, merkte an, dass die Implementierung der Änderungen, um das volle Potenzial von R8 auszuschöpfen, 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 mit weiteren Optimierungen zu experimentieren. Für diese Analyse stellte das Reddit-Engineering-Team zwei Versionen seiner App zur Verfügung: eine ohne Optimierungen und eine mit R8 und zwei weiteren grundlegenden Tools zur Leistungsoptimierung: Baseline-Profile und Startprofile.

Mit Baseline-Profilen werden die Schritte zur Just-in-Time-Kompilierung (JIT) von den Geräten der Nutzer auf die Entwicklungsmaschinen verlagert. Der generierte Ahead-Of-Time-Code (AOT) reduziert nachweislich sowohl die Startzeit als auch Rendering-Probleme.

Wenn eine App gepackt wird, werden die Klassen und Methoden vom d8-Dexer übernommen und die classes.dex-Dateien der App erstellt. 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 muss die App weniger Dateien laden, was wiederum die Startgeschwindigkeit verbessert.

Jetpack Macrobenchmark war das wichtigste Tool für diese Phase, da es eine präzise Messung von Nutzerinteraktionen in einer kontrollierten Umgebung ermöglicht. Um eine typische User Journey 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 zum Schreiben des Benchmarks nur Folgendes erforderlich:

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

Die Benchmarkdaten bestätigten die Beobachtungen vor Ort und lieferten tiefere Einblicke. Die vollständig optimierte App startete 55% schneller und Nutzer konnten 18% früher mit dem Surfen beginnen. Bei der optimierten App wurde außerdem die Anzahl der Just-in-time-Kompilierungen um zwei Drittel reduziert und die Just-in-time-Kompilierungszeit um ein Drittel verringert. Das Frame-Rendering wurde verbessert, sodass im Rahmen der User Journey 19% mehr Frames gerendert wurden. Außerdem wurde die Größe der App um mehr als ein Drittel reduziert.

image.png

Verbesserungen der Gesamtleistung von Reddit

Sie können die Just-in-time-Kompilierung mit einem benutzerdefinierten Macrobenchmark-Trace-Abschnittsmesswert wie diesem messen:

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

Die Technologie hinter der Transformation: R8

Wenn Sie R8 im vollständigen Modus aktivieren möchten, konfigurieren Sie die Datei app/build.gradle.kts, indem Sie im Release-Build-Typ minifyEnabled und shrinkResources auf true setzen.

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

Auf diesen Schritt müssen ganzheitliche End-to-End-Tests folgen, da Leistungsoptimierungen zu unerwünschtem Verhalten führen können, das Sie besser vor Ihren Nutzern erkennen sollten.

Wie bereits in diesem Artikel beschrieben, führt R8 umfangreiche Optimierungen durch, um die Leistung 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 R8 nicht ändern soll. Deklarieren Sie diese in Keep-Regeln.

Folgen Sie dem Beispiel von Reddit in Ihrer App

Der Erfolg von Reddit mit R8 ist ein überzeugendes Beispiel für alle Entwicklerteams, die mit geringem Aufwand die Leistung ihrer App deutlich verbessern möchten. Der direkte Zusammenhang 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, können sie ähnliche Erfolge erzielen. Dazu gehören die Verwendung von Tools wie dem App-Leistungsindex, um Optimierungsmöglichkeiten zu identifizieren, die Aktivierung des vollen Optimierungspotenzials von R8, das Monitoring von Daten aus der Praxis und die Verwendung von Benchmarks, um Erkenntnisse zu bestätigen und zu vertiefen.

Wenn Sie R8 in Ihrer eigenen App verwenden möchten, lesen Sie die aktualisierte offizielle Dokumentation und Anleitung zum Aktivieren, Konfigurieren und Beheben von Fehlern im R8-Optimierer.

Verfasst von:
Weiterlesen