Aufbewahrungsregeln

Wenn Sie die App-Optimierung mit den Standardeinstellungen aktivieren, 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.

Häufige Szenarien, die Aufbewahrungsregeln erfordern

R8 identifiziert und behält alle direkten Aufrufe in Ihrem Code bei. R8 kann jedoch keine indirekten Codeverwendungen erkennen. Daher kann es Code entfernen, den Ihre App benötigt, was zu Abstürzen führen kann. Mit Keep-Regeln können Sie R8 anweisen, solchen indirekt verwendeten Code beizubehalten. Hier sind einige häufige Situationen, in denen Sie wahrscheinlich Aufbewahrungsregeln benötigen:

  • Code, auf den über Reflection zugegriffen wird: R8 kann nicht erkennen, wann über Reflection auf Klassen, Felder oder Methoden zugegriffen wird. R8 kann beispielsweise keine Methode identifizieren, die anhand ihres Namens mit Class.getDeclaredMethod() gesucht wird, oder eine Annotation, die mit Class.getAnnotation() abgerufen wird. In diesen Fällen benennt R8 diese Methoden und Anmerkungen möglicherweise um oder entfernt sie vollständig, was zu einem ClassNotFoundException oder einem NoSuchMethodException zur Laufzeit führt.
  • Über Java Native Interface (JNI) aufgerufener Code: Wenn nativer Code (C oder C++) eine Java- oder Kotlin-Methode aufruft oder Java- oder Kotlin-Code C++-Code mit JNI aufruft, basiert der Aufruf auf einer dynamischen String-Suche nach dem Namen der Methode. R8 kann den dynamischen stringbasierten Methodenaufruf nicht erkennen, sodass die Optimierungen möglicherweise Ihren Code beschädigen.

Dies ist keine vollständige Liste der Szenarien, die Aufbewahrungsregeln erfordern. Sie deckt jedoch die meisten Fälle ab, in denen Sie Aufbewahrungsregeln benötigen.

Regeln zum Beibehalten von Daten in Ihrer App hinzufügen

Fügen Sie Ihre Regeln einer proguard-rules.pro-Datei hinzu, die sich im Stammverzeichnis des App-Moduls befindet. Die Datei ist möglicherweise bereits vorhanden. Falls nicht, erstellen Sie sie. Damit die Regeln in der Datei angewendet werden, müssen Sie die Datei in Ihrer build.gradle.kts-Datei (oder build.gradle-Datei) auf Modulebene deklarieren, wie im folgenden Code gezeigt:

Kotlin

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile("proguard-android-optimize.txt"),

                // File with your custom rules
                "proguard-rules.pro"
            )
           // ...
        }
    }
    // ...
}

Groovy

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true

            proguardFiles(
                // File with default rules provided by the Android Gradle Plugin
                getDefaultProguardFile('proguard-android-optimize.txt'),

                // File with your custom rules.
                'proguard-rules.pro'
            )
           // ...
        }
    }
    // ...
}

Standardmäßig enthält Ihre Build-Datei auch die Datei proguard-android-optimize.txt. Diese Datei enthält Regeln, die für die meisten Android-Projekte erforderlich sind. Sie sollte daher in der Build-Datei verbleiben. Diese Datei basiert auf der Datei proguard-common.txt und enthält dieselben Inhalte.

Größere Apps haben in der Regel Code in mehreren Bibliotheksmodulen. In solchen Fällen ist es oft besser, die Keep-Regeln neben den Code zu stellen, auf den sie sich beziehen, und zwar im jeweiligen Bibliotheksmodul. Der entscheidende Unterschied beim Beibehalten von Regeln für Bibliotheken liegt darin, wie Sie diese Regeln in der Datei build.gradle.kts (oder build.gradle) Ihres Bibliotheksmoduls deklarieren. Weitere Informationen finden Sie unter Optimierung für Bibliotheksautoren.

Aufbewahrungsregel hinzufügen

Wenn Sie Aufbewahrungsregeln hinzufügen, können Sie globale Optionen einbeziehen und eigene Aufbewahrungsregeln definieren.

  • Globale Optionen: Globale Optionen sind allgemeine Anweisungen, die sich auf die Funktionsweise von R8 für Ihre gesamte Codebasis auswirken. Weitere Informationen finden Sie unter Globale Optionen.
  • Keep-Regeln: Keep-Regeln müssen sorgfältig entworfen werden, damit Sie das richtige Gleichgewicht zwischen der Maximierung der Codeoptimierung und der Vermeidung unbeabsichtigter Fehler in Ihrer App finden. Informationen zur Syntax für Ihre eigenen Keep-Regeln finden Sie unter Syntax für Keep-Regeln.

Regeln für Bibliotheksautoren beibehalten

Nachdem Sie sich mit den globalen Optionen und der Syntax für Keep-Regeln vertraut gemacht haben, finden Sie weitere Informationen unter Optimierung für Bibliotheksautoren.