Fallstudien

Wie Reddit den R8-Optimizer für erhebliche Leistungsverbesserungen eingesetzt hat

Lesezeit: 4 Minuten
Ben Weiss
Developer Relations Engineer

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. Während 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 Leistungsanalyse wurde 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, einer Reduzierung langsamer oder eingefrorener Frames und ANRs sowie einer allgemeinen Steigerung der Bewertungen im 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 App-Leistung zu verbessern.Sehen wir uns die wichtigsten an.

  • Tree Shaking ist der wichtigste Schritt zur Reduzierung der App-Größe. 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 App leistungsfähiger wird.
  • Class Merging und andere Strategien werden angewendet, um den Code kompakter zu gestalten. An diesem Punkt geht es nicht mehr um die Lesbarkeit des Quellcodes durch Menschen, sondern darum, dass der kompilierte Code schnell funktioniert. Abstraktionen wie Schnittstellen oder Klassenhierarchien spielen hier keine Rolle und werden entfernt.
  • Bei der Identifier-Minifizierung werden die Namen von Klassen, Feldern und Methoden in kürzere, bedeutungslose Namen geändert. So kann aus MyDataModel beispielsweise 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.
image.png

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 verbesserte Leistungsergebnisse erzielt.Mit Android Vitals und Crashlytics konnte Reddit Leistungsmesswerte auf echten Geräten mit tatsächlichen Nutzern erfassen und so die neue Version mit früheren Versionen vergleichen.

image.png

So hat R8 die Leistung der Reddit-App verbessert

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 flüssigeres Frame-Rendering beseitigt UI-Ruckler, sodass das Scrollen und die Animationen flüssig und reaktionsschnell sind. Diese positiven technischen Auswirkungen waren auch in der Nutzerstimmung deutlich sichtbar.

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 verzeichnete das Team eine drastische und positive Veränderung der Nutzerstimmung und -interaktion.

image.png

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 mitgearbeitet hat, sagte, 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 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 weitere Optimierungen zu testen. Für diese Analyse stellte das Engineering-Team von Reddit zwei Versionen der App zur Verfügung: eine ohne Optimierungen und eine, 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 eine typische Nutzerreise 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 Einblicke. 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 um zwei Drittel und eine Reduzierung der JIT-Kompilierungszeit um ein Drittel festgestellt. Das Frame-Rendering wurde verbessert, sodass 19% mehr Frames während der Benchmark-Nutzerreise gerendert wurden. Außerdem wurde die Größe der App um mehr als ein Drittel reduziert.

image.png

Gesamtleistungsverbesserungen bei Reddit

Sie können die JIT-Kompilierungszeit mit einem benutzerdefinierten Macrobenchmark-Trace-Abschnittsmesswert wie diesem 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 Leistungsverbesserungen 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 Verbesserungspotenzial 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.

Verfasst von:

Weiterlesen