App-Optimierung mit R8 aktivieren

Für die bestmögliche Nutzererfahrung sollten Sie Ihre App so optimieren, dass sie so klein und schnell wie möglich ist. Unser App-Optimierungstool R8 optimiert Ihre App, indem es nicht verwendeten Code und nicht verwendete Ressourcen entfernt, Code umschreibt, um die Laufzeitleistung zu optimieren, und vieles mehr. Für Ihre Nutzer bedeutet das:

  • App startet schneller
  • Arbeitsspeichernutzung reduziert
  • Verbesserte Rendering- und Laufzeitleistung
  • Weniger ANRs

R8-Optimierung – Übersicht

R8 verwendet einen mehrstufigen Prozess, um Ihre App hinsichtlich Größe und Geschwindigkeit zu optimieren. Wichtige Vorgänge sind:

  • Codekomprimierung (auch Tree Shaking genannt): R8 identifiziert und entfernt nicht erreichbaren Code aus Ihrer Anwendung und ihren Bibliotheksabhängigkeiten. Durch die Analyse der Einstiegspunkte Ihrer App (z. B. Activities oder Services, die im Manifest definiert sind) erstellt R8 ein Diagramm des referenzierten Codes und entfernt alles, was nicht referenziert wird.

  • Logische Optimierungen: R8 schreibt Ihren Code um, um die Ausführungseffizienz zu verbessern und den Overhead zu reduzieren. Wichtige Techniken sind:

    • Method Inlining: R8 ersetzt eine Methodenaufrufstelle durch den tatsächlichen Text der aufgerufenen Methode. Dadurch wird der Overhead eines Funktionsaufrufs vermieden und R8 kann weitere Optimierungen durchführen.

    • Klassenzusammenführung: R8 kombiniert Gruppen von Klassen und Schnittstellen zu einer einzigen Klasse. Dadurch wird die Anzahl der Klassen in der App reduziert, der Arbeitsspeicher wird weniger belastet und die Startgeschwindigkeit verbessert.

  • Verschleierung (auch Reduzierung genannt): Um die Größe der DEX Datei zu reduzieren, kürzt R8 die Namen von Klassen, Feldern und Methoden (z. B. kann com.example.MyActivity zu a.b.a werden).

Ab Version 8.12.0 des Android-Gradle-Plug-ins (AGP) optimiert R8 auch Ressourcen im Rahmen seiner Optimierungsphasen. Weitere Informationen finden Sie unter Optimierte Ressourcenkomprimierung.

Optimierung aktivieren

Wenn Sie die App-Optimierung aktivieren möchten, legen Sie isMinifyEnabled = true (für die Codeoptimierung) und isShrinkResources = true (für die Ressourcenoptimierung) in Ihrem Release Build's Build-Skript auf App-Ebene fest, wie im folgenden Code gezeigt. Wir empfehlen, immer beide Einstellungen zu aktivieren. Außerdem empfehlen wir, die App-Optimierung nur in der endgültigen Version Ihrer App zu aktivieren, die Sie vor der Veröffentlichung testen – in der Regel Ihr Release-Build. Die Optimierungen verlängern die Build-Zeit Ihres Projekts und können das Debugging erschweren, da sie den Code ändern.

Kotlin

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            isMinifyEnabled = true

            // Enables resource shrinking.
            isShrinkResources = true

            proguardFiles(
                // Default file with automatically generated optimization rules.
                getDefaultProguardFile("proguard-android-optimize.txt"),

                ...
            )
            ...
        }
    }
    ...
}

Groovy

android {
    buildTypes {
        release {

            // Enables code-related app optimization.
            minifyEnabled = true

            // Enables resource shrinking.
            shrinkResources = true

            // Default file with automatically generated optimization rules.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')

            ...
        }
    }
}

Ressourcenkomprimierung optimieren, um noch kleinere Apps zu erstellen

Mit Version 8.12.0 des Android-Gradle-Plug-ins (AGP) wird die optimierte Ressourcenkomprimierung eingeführt, mit der Ressourcen- und Codeoptimierung integriert werden sollen, um noch kleinere und schnellere Apps zu erstellen.

Vor der optimierten Ressourcenkomprimierung hat das Android Asset Packaging Tool (AAPT2) Keep-Regeln generiert, die die Ressourcenkomprimierung effektiv getrennt vom Code behandelt haben. Dabei wurden oft nicht zugänglicher Code oder Ressourcen beibehalten, die aufeinander verwiesen haben.

Bei der optimierten Ressourcenkomprimierung werden Ressourcen als Teil des Programmcodes betrachtet und bilden das Referenzdiagramm. Wenn auf eine Sammlung von Code oder Ressourcen nicht verwiesen wird, ist sie nicht durch eine Keep-Regel geschützt und kann entfernt werden.

Optimierte Ressourcenkomprimierung aktivieren

Wenn Sie die neue optimierte Entfernung von Ressourcen-Pipeline für AGP 8.12 oder 8.13 aktivieren möchten, fügen Sie der Datei gradle.properties Ihres Projekts Folgendes hinzu:

android.r8.optimizedResourceShrinking=true

Wenn Sie AGP 9.0.0 oder eine neuere Version verwenden, müssen Sie android.r8.optimizedResourceShrinking=true nicht festlegen. Die optimierte Ressourcenkomprimierung wird automatisch angewendet, wenn isShrinkResources = true in Ihrer Build-Konfiguration aktiviert ist.

R8-Optimierungseinstellungen überprüfen und konfigurieren

Damit R8 seine vollständigen Optimierungsfunktionen nutzen kann, entfernen Sie die folgende Zeile aus der Datei gradle.properties Ihres Projekts, falls sie vorhanden ist:

android.enableR8.fullMode=false # Remove this line from your codebase.

Wenn Sie die App-Optimierung aktivieren, sind Stacktraces schwer zu verstehen, insbesondere wenn R8 Klassen- oder Methodennamen umbenennt. Informationen zum Abrufen von Stacktraces, die Ihrem Quellcode entsprechen, finden Sie unter Ursprünglichen Stacktrace wiederherstellen.

Wenn R8 aktiviert ist, sollten Sie auch Startprofile erstellen, um die Startleistung noch weiter zu verbessern.

Wenn Sie die App-Optimierung aktivieren und dadurch Fehler auftreten, können Sie sie mit den folgenden Strategien beheben:

Wenn Sie die Build-Geschwindigkeit optimieren möchten, finden Sie unter Konfigurieren, wie R8 ausgeführt wird Informationen zum Konfigurieren von R8 basierend auf Ihrer Umgebung.

Verhaltensänderungen bei AGP- und R8-Versionen

In der folgenden Tabelle sind die wichtigsten Funktionen aufgeführt, die in verschiedenen Versionen des Android-Gradle-Plug-ins (AGP) und des R8-Compilers eingeführt wurden.

AGP-Version Eingeführte Funktionen
9.1 Klassen werden standardmäßig neu verpackt:R8 verpackt Klassen neu (verschiebt sie auf oberster Ebene in das unbenannte Paket), um DEX weiter zu komprimieren. Dadurch muss die Option -repackageclasses nicht mehr angegeben werden. Informationen zur Funktionsweise und zum Deaktivieren finden Sie unter Globale Optionen.
9.0 Optimierte Ressourcenkomprimierung:Standardmäßig aktiviert (wird mit android.r8.optimizedResourceShrinking gesteuert). Die optimierte Ressourcenkomprimierung trägt dazu bei, die Ressourcenkomprimierung in die Codeoptimierungspipeline zu integrieren, was zu kleineren und schnelleren Apps führt. Durch die gleichzeitige Optimierung von Code- und Ressourcenreferenzen werden Ressourcen identifiziert und entfernt, auf die ausschließlich von nicht verwendetem Code verwiesen wird. Dies ist eine erhebliche Verbesserung gegenüber den bisherigen separaten Optimierungsprozessen.

Das ist besonders nützlich für Apps, die erhebliche Ressourcen und Code über verschiedene Formfaktoren hinweg gemeinsam nutzen. Hier wurden Verbesserungen der App-Größe von über 50% gemessen. Die resultierende Größenreduzierung führt zu kleineren Downloads, schnelleren Installationen und einer besseren Nutzererfahrung mit schnellerem Start, verbessertem Rendering und weniger ANRs.

Regelfilterung für Bibliotheken:Die Unterstützung für globale Optionen (z. B. -dontobfuscate) in Regeln für Bibliotheksnutzer wurde eingestellt und Apps filtern sie heraus. Weitere Informationen finden Sie unter Globale Optionen hinzufügen.

Kotlin-Nullprüfungen:Standardmäßig optimiert (wird mit -processkotlinnullchecks gesteuert). Mit dieser Version wurden auch erhebliche Verbesserungen bei der Build-Geschwindigkeit eingeführt. Weitere Informationen finden Sie unter Globale Optionen für zusätzliche Optimierung.

Bestimmte Pakete optimieren:Mit packageScope können Sie bestimmte Pakete optimieren. Dies ist eine experimentelle Funktion. Weitere Informationen finden Sie unter Bestimmte Pakete mit packageScope.

Standardmäßig optimiert:Die Unterstützung für getDefaultProguardFile("proguard-android.txt") wurde eingestellt, da sie -dontoptimize enthält, was vermieden werden sollte. Verwenden Sie stattdessen "proguard-android-optimize.txt". Wenn Sie die Optimierung in Ihrer App global deaktivieren müssen, fügen Sie das Flag manuell zu einer ProGuard-Datei hinzu.
8.12 Optimierte Entfernung von Ressourcen: Erste Unterstützung hinzugefügt (wird mit android.r8.optimizedResourceShrinking gesteuert). Die optimierte Entfernung von Ressourcen trägt dazu bei, die Entfernung von Ressourcen in die Codeoptimierungspipeline zu integrieren. In dieser Version von AGP müssen Sie sie manuell aktivieren.

Logcat-Retracing: Unterstützung für automatisches Retracing im Android Studio Logcat-Fenster.
8.6 Verbessertes Retracing:Umfasst standardmäßig das Retracing von Dateinamen und Zeilennummern für alle minSdk-Ebenen (zuvor war minSdk 26+ in Version 8.2 erforderlich).

Durch die Aktualisierung von R8 sind Stacktraces aus verschleierten Builds leichter und klarer lesbar. In dieser Version wurde die Zuordnung von Zeilennummern und Quelldateien verbessert, sodass Tools wie Android Studio Logcat Abstürze automatisch zum ursprünglichen Quellcode zurückverfolgen können.
8.0 Standardmäßig im vollständigen Modus: Der vollständige Modus von R8 bietet eine deutlich leistungsstärkere Optimierung. Dieser Parameter ist standardmäßig aktiviert. Sie können ihn mit android.enableR8.fullMode=false deaktivieren.
7 Vollständiger Modus verfügbar:Als optionale Funktion mit android.enableR8.fullMode=true eingeführt. Der vollständige Modus wendet leistungsstärkere Optimierungen an, indem er strengere Annahmen darüber trifft, wie Ihr Code Reflexion und andere dynamische Funktionen verwendet. Dadurch wird die App-Größe reduziert und die Leistung verbessert. Es sind jedoch möglicherweise zusätzliche Keep-Regeln erforderlich, um zu verhindern, dass notwendiger Code entfernt wird.