Activer l'optimisation des applications avec R8

Pour une meilleure expérience utilisateur, vous devez optimiser votre application pour qu'elle soit aussi compacte et rapide que possible. Notre outil d'optimisation d'applications, appelé R8, simplifie votre application en supprimant le code et les ressources inutilisés, en réécrivant le code pour optimiser les performances d'exécution, et plus encore. Pour vos utilisateurs, cela signifie :

  • accélérer le démarrage ;
  • réduire l'utilisation de la mémoire ;
  • améliorer les performances de rendu et d'exécution ;
  • réduire le nombre d'ANR.

Présentation de l'optimisation R8

R8 utilise un processus en plusieurs phases pour optimiser la taille et la vitesse de votre application. Voici les principales opérations :

  • Minification de code (également appelée "tree shaking") : R8 identifie et supprime le code inaccessible de votre application et de ses dépendances de bibliothèque. En analysant les points d'entrée de votre application (tels que les Activities ou les Services définis dans le fichier manifeste), R8 crée un graphique du code référencé et supprime tout ce qui n'est pas référencé.

  • Optimisations logiques : R8 réécrit votre code pour améliorer l'efficacité de l'exécution et réduire la surcharge. Voici les principales techniques :

    • Inlining de méthode : R8 remplace un site d'appel de méthode par le corps réel de la méthode appelée. Cela élimine la surcharge d'un appel de fonction et permet à R8 d'effectuer d'autres optimisations.

    • Fusion de classes : R8 combine des ensembles de classes et d'interfaces en une seule classe. Cela réduit le nombre de classes dans l'application, ce qui diminue la pression sur la mémoire et améliore la vitesse de démarrage.

  • Obscurcissement (également appelé "minimisation") : pour réduire la taille du fichier DEX , R8 raccourcit les noms des classes, des champs et des méthodes (par exemple, com.example.MyActivity peut devenir a.b.a).

Depuis la version 8.12.0 du plug-in Android Gradle (AGP), R8 optimise également les ressources dans le cadre de ses phases d'optimisation. Pour en savoir plus, consultez la section Réduction optimisée des ressources.

Activer l'optimisation

Pour activer l'optimisation de l'application, définissez isMinifyEnabled = true (pour l'optimisation du code) et isShrinkResources = true (pour l'optimisation des ressources) dans le script de build au niveau de l'application de votre release build's, comme indiqué dans le code suivant. Nous vous recommandons d'activer systématiquement les deux paramètres. Nous vous recommandons également d'activer l'optimisation de l'application uniquement dans la version finale de l’application que vous testez avant la publication (généralement votre build), car les optimisations augmentent la durée de la compilation de votre projet et peuvent compliquer le débogage en raison de la façon dont elles modifient le code.

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')

            ...
        }
    }
}

Optimiser la réduction des ressources pour des applications encore plus compactes

La version 8.12.0 du plug-in Android Gradle (AGP) introduit la réduction optimisée des ressources, qui vise à intégrer l'optimisation des ressources et du code pour créer des applications encore plus compactes et plus rapides.

Avant la réduction optimisée des ressources, Android Asset Packaging Tool (AAPT2) générait des règles de conservation qui traitaient efficacement la réduction des ressources séparément du code, conservant souvent du code ou des ressources inaccessibles qui se référençaient mutuellement.

Avec la réduction optimisée des ressources, les ressources sont considérées comme faisant partie du code du programme, formant le graphique de référence. Lorsqu'une collection de code ou de ressources n'est pas référencée, elle n'est pas protégée par une règle de conservation et peut être supprimée.

Activer la réduction optimisée des ressources

Pour activer le nouveau pipeline de réduction optimisée des ressources pour AGP 8.12 ou 8.13, ajoutez le code suivant au fichier gradle.properties de votre projet :

android.r8.optimizedResourceShrinking=true

Si vous utilisez AGP 9.0.0 ou une version ultérieure, vous n'avez pas besoin de définir android.r8.optimizedResourceShrinking=true. La réduction optimisée des ressources est automatiquement appliquée lorsque isShrinkResources = true est activé dans la configuration de votre compilation.

Vérifier et configurer les paramètres d'optimisation R8

Pour permettre à R8 d'utiliser toutes ses capacités d'optimisation, supprimez la ligne suivante du fichier gradle.properties de votre projet, si elle existe :

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

Notez que l'activation de l'optimisation de l'application complique la compréhension des traces de pile, en particulier si R8 renomme les noms de classes ou de méthodes. Pour obtenir des traces de pile qui correspondent correctement à votre code source, consultez Récupérer la trace de pile d'origine.

Si R8 est activé, vous devez également créer des profils de démarrage pour améliorer encore les performances de démarrage.

Si vous activez l'optimisation de l'application et que cela provoque des erreurs, voici quelques stratégies pour les corriger :

Si vous souhaitez optimiser votre vitesse de compilation, consultez Configurer l'exécution de R8 pour savoir comment configurer R8 en fonction de votre environnement.

Améliorer l'optimisation R8

Les avantages en termes de performances de R8 sont directement corrélés à la quantité de votre codebase que R8 est en mesure d'optimiser. Pour tirer le meilleur parti de R8, activez R8 en mode complet et affinez les règles de conservation afin de permettre une optimisation maximale des classes, des champs et des méthodes.Pour vous aider, utilisez l' analyseur de configuration R8.

L'analyseur de configuration R8 vous permet d'effectuer les opérations suivantes :

  • Suivre et améliorer la qualité globale de la configuration R8 en surveillant les métriques fournies par le rapport de l'analyseur de configuration R8.
  • Trouver les règles de conservation les plus larges, celles qui empêchent le plus d'optimisation
  • et comprendre l'optimisation qu'elles empêchent de les affiner.

L'analyseur de configuration R8 est disponible dans la version 9.3.0-alpha05 d'AGP ou à partir de la version 9.3.7-dev de R8. Pour en savoir plus, consultez Analyser la configuration R8.

Modifications du comportement des versions AGP et R8

Le tableau suivant présente les principales fonctionnalités introduites dans différentes versions du plug-in Android Gradle (AGP) et du compilateur R8.

Version de l'AGP Fonctionnalités introduites
9.1 Classes reconditionnées par défaut : R8 reconditionne les classes (en les déplaçant vers le package sans nom, au niveau supérieur) pour compacter davantage les fichiers DEX, ce qui élimine la nécessité de spécifier l'option -repackageclasses. Pour savoir comment cela fonctionne et comment désactiver cette option, consultez Options globales.
9 Réduction optimisée des ressources : activée par défaut (contrôlée à l'aide de android.r8.optimizedResourceShrinking). La réduction optimisée des ressources permet d'intégrer la réduction des ressources au pipeline d'optimisation du code, ce qui permet de créer des applications plus compactes et plus rapides. En optimisant simultanément les références de code et de ressources, elle identifie et supprime les ressources référencées exclusivement à partir de code inutilisé. Il s'agit d'une amélioration significative par rapport aux processus d'optimisation distincts précédents.

Cette fonctionnalité est particulièrement utile pour les applications qui partagent des ressources et du code importants sur différents marchés verticaux de facteurs de forme, avec des améliorations mesurées de plus de 50% de la taille de l'application. La réduction de taille qui en résulte permet de réduire la taille des téléchargements, d'accélérer les installations et d'améliorer l'expérience utilisateur grâce à un démarrage plus rapide, un rendu amélioré et moins d'ANR.

Filtrage des règles de bibliothèque : la prise en charge des options globales (par exemple, -dontobfuscate) dans les règles de consommateur de bibliothèque a été supprimée, et les applications les filtreront. Pour en savoir plus, consultez Ajouter des options globales.

Vérifications de valeurs nulles Kotlin : optimisées par défaut (contrôlées à l'aide de -processkotlinnullchecks). Cette version a également introduit des améliorations significatives de la vitesse de compilation. Pour en savoir plus, consultez Options globales pour une optimisation supplémentaire.

Optimiser des packages spécifiques : vous pouvez utiliser packageScope pour optimiser des packages spécifiques. Cette fonctionnalité est en version bêta. Pour en savoir plus, consultez Optimiser des packages spécifiés avec packageScope.

Optimisé par défaut : la prise en charge de getDefaultProguardFile("proguard-android.txt") a été supprimée, car elle inclut -dontoptimize, ce qui doit être évité. Utilisez plutôt "proguard-android-optimize.txt". Si vous devez désactiver globalement l'optimisation dans votre application, ajoutez manuellement le flag à un fichier ProGuard.
8.12 Réduction optimisée des ressources : prise en charge initiale ajoutée (contrôlée à l'aide de android.r8.optimizedResourceShrinking). La réduction optimisée des ressources permet d'intégrer la réduction des ressources au pipeline d'optimisation du code. Vous devez l'activer manuellement dans cette version d'AGP.

Retraçage Logcat : prise en charge du retraçage automatique dans la fenêtre Logcat d'Android Studio.
8.6 Retraçage amélioré : inclut le retraçage du nom de fichier et du numéro de ligne par défaut pour tous les niveaux minSdk (auparavant, minSdk 26+ était requis dans la version 8.2).

La mise à jour de R8 permet de s'assurer que les traces de pile des builds obscurcis sont facilement et clairement lisibles. Cette version améliore la façon dont les numéros de ligne et les fichiers sources sont mappés, ce qui permet aux outils tels que Logcat d'Android Studio de retracer automatiquement les plantages vers le code source d'origine.
8.0 Mode complet par défaut : le mode complet R8 offre une optimisation beaucoup plus puissante. Il est activé par défaut. Vous pouvez le désactiver à l'aide de android.enableR8.fullMode=false.
7.0 Mode complet disponible : introduit en tant que fonctionnalité d'activation à l'aide de android.enableR8.fullMode=true. Le mode complet applique des optimisations plus puissantes en formulant des hypothèses plus strictes sur la façon dont votre code utilise la réflexion et d'autres fonctionnalités dynamiques. Bien qu'il réduise la taille de l'application et améliore les performances, il peut nécessiter des règles de conservation supplémentaires pour empêcher la suppression du code nécessaire.