Angegebene Pakete mit „packageScope“ optimieren (experimentell)

Sie können bestimmte Pakete mit R8 und packageScope optimieren. Dies ist als optionaler erster Schritt für Apps gedacht, die R8 noch nicht verwenden, und wird für Apps, die R8 bereits verwenden, nicht empfohlen.

Überlegen Sie, ob Sie packageScope verwenden möchten.

Wenn Ihre App bereits R8 verwendet, sollten Sie packageScope nicht verwenden, da dies in Bezug auf Leistung und App-Größe eine suboptimale Konfiguration ist. Stattdessen sollten Sie die R8-Konfiguration Ihrer App mit verbesserten Keep-Regeln optimieren oder, wenn Sie den Kompatibilitätsmodus verwenden, zum vollständigen Modus von R8 migrieren.

Bei Apps, die R8 noch nicht verwenden, aber auf R8 umgestellt werden, können Sie packageScope verwenden, um die Umstellung schrittweise zu verwalten. R8 wendet leistungsstarke Optimierungen an, die das App-Verhalten ändern können. Wenn Sie diese Optimierungen auf bestimmte Pakete beschränken, die sicher optimiert werden können, z. B. AndroidX und Kotlin, können Sie die Leistung mit minimalem Risiko steigern. Sobald Ihre App stabil ist, können Sie diese Optimierungen schrittweise auf den Rest Ihrer Codebasis und Abhängigkeiten ausweiten und die Stabilität in jeder Phase testen.

Voraussetzungen

Für die Verwendung von R8 mit packageScope ist das Android-Gradle-Plug-in 9.0 oder höher erforderlich.

Optimierung konfigurieren

Führen Sie die folgenden Schritte aus, um die Optimierung mit packageScope zu aktivieren.

Zu optimierende Bibliotheken auswählen

Ermitteln Sie die zu optimierenden Bibliotheken. Wir empfehlen, mit den AndroidX- und Kotlin-Bibliotheken androidx.**, kotlin.** und kotlinx.** zu beginnen, da es sich um stabile Bibliotheken handelt, die für die R8-Kompatibilität konfiguriert wurden.

Unterstützung für die Verwendung von R8 mit packageScope aktivieren

Fügen Sie der Datei gradle.properties Ihres Projekts Folgendes hinzu:

android.r8.gradual.support=true

Optimierungsblock einrichten

Fügen Sie in der Datei build.gradle.kts (oder build.gradle) auf Modulebene einen optimization-Block in die Release-Build-Konfiguration ein. Verwenden Sie innerhalb dieses Blocks packageScope, um die zu optimierenden Pakete aufzulisten. Schließen Sie in der Datei build.gradle.kts die Paketliste in setOf() ein.

Kotlin

android {
  buildTypes {
    release {
      proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),"proguard-rules.pro")
      optimization {
        enable = true
        packageScope = setOf("androidx.**","kotlin.**", "kotlinx.**")
      }
    }
  }
}

Groovy

android {
  buildTypes {
    release {
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
      optimization {
        enable = true
        packageScope = ["androidx.**", "kotlin.**", "kotlinx.**"]
      }
    }
  }
}

Optimierung testen

Nachdem Sie die packageScope-Erklärung angewendet oder aktualisiert haben, sollten Sie Ihre App gründlich testen, um zu prüfen, ob es zu unerwarteten Abstürzen oder Verhaltensänderungen gekommen ist.

Von der Optimierung bestimmter Pakete zur Optimierung der gesamten App wechseln

Um die Vorteile der Optimierung zu maximieren, sollten Sie nach und nach von der Verwendung von packageScope zur Verwendung von R8 in Ihrer gesamten App übergehen. Dieser Prozess umfasst die schrittweise Erweiterung der Optimierungsabdeckung:

  1. Mit stabilen Bibliotheken beginnen: Beginnen Sie damit, nur weit verbreitete, stabile Bibliotheken, die mit den Optimierungen von R8 kompatibel sind, in die Liste packageScope aufzunehmen. Beginnen Sie mit den AndroidX- und Kotlin-Bibliotheken androidx.**, kotlin.** und kotlinx.**.
  2. Pakete schrittweise hinzufügen: Fügen Sie der packageScope nach und nach neue Paketpräfixe hinzu:
    1. Abhängigkeiten bewerten: Überprüfen Sie die Bibliotheken Ihrer App. Gute Kandidaten für die packageScope-Liste sind offizielle Google-Bibliotheken (z. B. com.google.**) und andere robuste Bibliotheken wie OkHttp (z. B. okhttp3.** und okio.**). Priorisieren Sie Bibliotheken, die keine umfangreichen Reflexions-, Serialisierungs- oder nativen Codeaufrufe (JNI) erfordern.
    2. Basierend auf der Paketgröße priorisieren: Mit dem APK Analyzer von Android Studio können Sie die größten Faktoren für die Größe Ihrer App ermitteln. 1. Erstellen Sie ein Release-AAB oder ‑APK, bei dem R8 deaktiviert ist. 1. Öffnen Sie die Datei im Analysetool und prüfen Sie die dex-Dateien. 1. Pakete nach Größe sortieren. Die größten Pakete bieten den höchsten Return on Investment (ROI) für die Optimierung. Wenn Sie diese zuerst anvisieren, erreichen Sie die größte Größenreduzierung zu Beginn des Prozesses, sofern diese Bibliotheken keine zu weit gefassten Keep-Regeln haben. Weitere Informationen finden Sie unter Bibliotheken mit Bedacht auswählen.
  3. Verhaltensänderungen überprüfen Führen Sie nach dem Hinzufügen jedes neuen Paketpräfixes umfassende Tests durch, um Regressionen oder unerwartetes Verhalten zu erkennen und zu beheben.
  4. App-Pakete zuletzt hinzufügen: Wenn in Ihren App-Paketen nicht viel Reflection verwendet wird, nehmen Sie die App-Pakete in packageScope auf und fügen Sie nach Bedarf inkrementell Keep-Regeln hinzu. Wenn in Ihren App-Paketen viel Reflection verwendet wird, fügen Sie die Pakete in packageScope ein und fügen Sie paketweite Keep-Regeln für die erforderlichen Pakete hinzu. Wiederholen Sie die Schritte für die Aufbewahrungsregeln, um sie zu optimieren.
  5. R8 für die gesamte App verwenden: Nachdem die meisten Abhängigkeiten Ihrer App in der packageScope-Deklaration enthalten sind und Ihre App stabil ist, entfernen Sie packageScope, um die gesamte App im Vollmodus zu optimieren.