À propos des règles de conservation

Lorsque vous activez l'optimisation de l'application avec les paramètres par défaut, R8 effectue des optimisations importantes afin de maximiser les avantages en termes de performances. R8 apporte des modifications importantes au code, y compris en renommant, en déplaçant et en supprimant des classes, des champs et des méthodes. Si vous constatez que ces modifications entraînent des erreurs, vous devez spécifier les parties du code que R8 ne doit pas modifier en les déclarant dans des règles de conservation.

Scénarios courants nécessitant des règles de conservation

R8 identifie et préserve tous les appels directs dans votre code. Toutefois, R8 ne peut pas voir les utilisations indirectes du code, ce qui peut l'amener à supprimer du code dont votre application a besoin, entraînant ainsi des plantages. Utilisez des règles keep pour indiquer à R8 de conserver ce code utilisé indirectement. Voici quelques situations courantes dans lesquelles vous aurez probablement besoin de règles de conservation :

  • Code accédé par réflexion : R8 ne peut pas identifier quand des classes, des champs ou des méthodes sont accédés par réflexion. Par exemple, R8 ne peut pas identifier une méthode recherchée par son nom à l'aide de Class.getDeclaredMethod() ni une annotation récupérée avec Class.getAnnotation(). Dans ce cas, R8 peut renommer ces méthodes et annotations ou les supprimer complètement, ce qui entraîne une erreur ClassNotFoundException ou NoSuchMethodException au moment de l'exécution.
  • Code appelé à partir de l'interface JNI (Java Native Interface) : lorsqu'un code natif (C ou C++) appelle une méthode Java ou Kotlin, ou qu'un code Java ou Kotlin appelle un code C++ avec JNI, l'appel est basé sur une recherche dynamique de chaîne du nom de la méthode. R8 ne peut pas voir l'appel de méthode dynamique basé sur une chaîne. Ses optimisations peuvent donc casser votre code.

Cette liste de scénarios n'est pas exhaustive, mais elle couvre la plupart des cas où vous pourriez avoir besoin de règles de conservation.

Ajouter des règles de conservation à votre application

Vous devez ajouter vos règles à un fichier proguard-rules.pro situé dans le répertoire racine du module d'application. Il est possible que le fichier soit déjà présent. Si ce n'est pas le cas, créez-le. Pour appliquer les règles du fichier, vous devez le déclarer dans votre fichier build.gradle.kts (ou build.gradle) au niveau du module, comme indiqué dans le code suivant :

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'
            )
           // ...
        }
    }
    // ...
}

Par défaut, votre fichier de compilation inclut également le fichier proguard-android-optimize.txt. Ce fichier inclut des règles requises pour la plupart des projets Android. Vous devez donc le laisser dans le fichier de compilation. Ce fichier est basé sur le fichier proguard-common.txt et partage du contenu avec celui-ci.

Les applications plus volumineuses contiennent généralement du code dans plusieurs modules de bibliothèque. Dans ce cas, il est souvent préférable de placer les règles de conservation à côté du code auquel elles s'appliquent dans le module de bibliothèque spécifique. La différence cruciale dans la gestion des règles de conservation pour les bibliothèques réside dans la façon dont vous déclarez ces règles dans le fichier build.gradle.kts (ou build.gradle) du module de votre bibliothèque. Pour en savoir plus, consultez Optimisation pour les auteurs de bibliothèques.

Ajouter une règle de conservation

Lorsque vous ajoutez des règles de conservation, vous pouvez inclure des options globales et définir vos propres règles de conservation.

  • Options globales : les options globales sont des directives générales qui affectent le fonctionnement de R8 sur l'ensemble de votre codebase. Pour en savoir plus, consultez Options globales.
  • Règles Keep : les règles Keep doivent être conçues avec soin pour vous assurer d'obtenir le bon équilibre entre l'optimisation maximale du code et le risque de casser involontairement votre application. Pour en savoir plus sur la syntaxe de vos propres règles Keep, consultez Syntaxe des règles Keep.

Conserver les règles pour les auteurs de bibliothèques

Après avoir découvert les options globales et la syntaxe des règles de conservation, consultez Optimisation pour les auteurs de bibliothèques pour en savoir plus.