L'analyseur de configuration R8 est un outil conçu pour vous aider à maximiser les avantages de R8 en termes de performances. Pour ce faire, il fournit des informations détaillées sur la qualité de la configuration de votre application. Il vous permet de suivre et d'améliorer l'optimisation R8 en surveillant les métriques clés (scores de réduction, d'optimisation et d'obscurcissement, plus précisément), qui indiquent le pourcentage de votre codebase disponible pour l'optimisation. En identifiant les règles de conservation larges ou inutiles, y compris celles introduites par des bibliothèques tierces, l'analyseur vous aide à affiner votre configuration pour vous assurer que R8 peut optimiser efficacement le plus grand nombre possible de vos classes, champs et méthodes.
Générer le rapport
Avec AGP 9.3.0 et versions ultérieures, vous pouvez générer le rapport de l'analyseur de configuration R8 à l'aide d'une tâche Gradle autonome dédiée ou automatiquement lors d'une compilation R8.
Exécuter la tâche Gradle autonome (recommandé pour une utilisation locale)
Lorsque vous itérez activement sur les règles Keep, utilisez la tâche Gradle autonome pour évaluer rapidement l'impact de vos modifications sans compiler entièrement l'APK ni le bundle :
./gradlew :app:analyzeReleaseR8Config
Comme cette tâche ignore la génération d'APK ou de bundle, elle fournit une boucle de rétroaction beaucoup plus courte. Cela vous permet d'analyser rapidement l'impact de vos règles Keep sur les scores de réduction, d'optimisation et d'obscurcissement, et de les affiner immédiatement. Le rapport HTML est généré à l'adresse app/build/reports/r8/r8-config-analyzer-release.html.
Générer automatiquement lors des compilations régulières
Lorsque vous exécutez une version R8 complète (par exemple, assembleRelease), le rapport est généré automatiquement à l'emplacement build/outputs/mapping/release/configanalyzer.html.
Pour désactiver la génération automatique des sorties lors des compilations régulières, définissez la propriété Gradle suivante :
android.experimental.r8.enableR8ConfigurationAnalyzer=false
Pour AGP 9.2 et versions antérieures
Pour AGP 9.2 et versions antérieures, définissez la propriété système com.android.tools.r8.dumpkeepradiushtmltodirectory lorsque vous exécutez une tâche Gradle avec une compilation activée avec R8.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
Par exemple, utilisez la commande suivante pour générer le rapport HTML dans le répertoire /tmp/r8analysis :
# To create the /tmp/r8analysis folder.
mkdir -p /tmp/r8analysis
# To generate the report in the /tmp/r8analysis folder.
./gradlew assembleRelease \
-Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=/tmp/r8analysis
Comprendre le rapport
L'outil R8 Configuration Analyzer fournit des informations sur la configuration R8 de votre application et sur l'impact de chaque règle de conservation sur votre application. Cela vous aide à obtenir une optimisation maximale de R8, ce qui améliore les performances de votre application. Utilisez les scores suivants pour comprendre la part de votre codebase qui peut être optimisée par R8.
Score de réduction
Lorsque R8 réduit la taille de votre application, il identifie et élimine le code et les ressources inutilisés, ce qui permet de réduire la taille globale de votre application et de s'assurer que votre build final est aussi léger que possible. Le score de minification indique le pourcentage de classes, de champs et de méthodes soumis à la minification. Par exemple, un score de réduction de 66% signifie que R8 peut effectuer une réduction dans 66% de votre base de code.
Score d'optimisation
R8 effectue des optimisations telles que l'intégration de méthodes et la fusion de classes, ce qui améliore le démarrage et la mémoire de votre application. Le score d'optimisation suit le pourcentage de classes, de champs et de méthodes soumis aux optimisations R8. Par exemple, si le taux d'optimisation est de 66%, cela signifie que R8 ne peut effectuer l'optimisation que dans 66% de votre code.
Score d'obscurcissement
En obscurcissant les classes, les champs et les méthodes en noms plus courts, R8 réduit l'empreinte des métadonnées de l'application pour économiser de la mémoire. Le score d'obscurcissement mesure le pourcentage de code disponible pour l'obscurcissement dans votre codebase.
Affiner les règles de conservation
Pour améliorer les scores et débloquer une meilleure optimisation R8, vous devez affiner vos règles de conservation afin qu'elles n'empêchent pas inutilement R8 d'optimiser votre application. Vous ne devez conserver que les classes, méthodes ou champs auxquels vous accédez à l'aide de la réflexion.
Pour ce faire, utilisez l'analyse des règles de conservation.
Pour afficher l'analyse détaillée d'une règle, cliquez dessus pour ouvrir l'écran d'informations.
Affiner les règles de conservation
Pour affiner vos règles de conservation et exploiter tout le potentiel des optimisations R8 pour votre application, procédez comme suit :
- Pour chaque règle Keep, consultez le pourcentage de classes, de champs et de méthodes qui ne peuvent pas être optimisés par R8 dans l'analyseur de configuration. Utilisez-le pour identifier les règles Keep qui empêchent l'optimisation dans un grand nombre de classes, de champs ou de méthodes. Les propriétés d'optimisation empêchées par chaque règle de conservation sont également listées.
- Si vous voyez une règle Keep qui empêche l'optimisation d'un grand nombre de classes, vérifiez les classes, les champs et les méthodes qui ne peuvent pas être optimisés par la règle Keep. Vous pourrez ainsi déterminer si cette règle conserve des éléments qui ne sont pas appelés de manière dynamique à l'aide de la réflexion.
- Réduisez l'optimisation bloquée par les règles de conservation en ciblant uniquement les classes, les champs ou les méthodes nécessaires en choisissant la bonne option de conservation et en suivant les bonnes pratiques.
- Examinez et exécutez des tests qui couvrent les classes, les champs et les méthodes concernés de la règle Keep, puis affinez les règles Keep.
Inspecter l'optimisation des bibliothèques
Lorsque vous intégrez des bibliothèques tierces, elles incluent souvent leurs propres règles de conservation des consommateurs pour fonctionner avec R8. Comme l'auteur de la bibliothèque ne peut pas prédire votre implémentation spécifique, il écrit parfois des règles prudentes et de grande envergure qui empêchent l'optimisation dans plus de classes, de champs et de méthodes que nécessaire. Cela peut empêcher R8 d'optimiser des parties de votre application qui n'ont rien à voir avec l'exécution réelle de la bibliothèque au moment de l'exécution. Vous pouvez utiliser l'analyseur de configuration R8 pour identifier les bibliothèques qui introduisent des règles ayant un impact négatif sur l'optimisation de votre application.
Utilisez l'analyseur de configuration pour inspecter l'effet combiné de toutes les règles de conservation des consommateurs fusionnées. En analysant l'impact de chaque règle de conservation provenant d'une bibliothèque tierce, vous pouvez identifier et suivre les bibliothèques tierces spécifiques qui empêchent une optimisation importante dans votre application.
Optimiser les bibliothèques
Pour résoudre les problèmes liés aux règles de conservation introduites par des bibliothèques tierces, procédez comme suit :
- Si une bibliothèque inclut une règle trop large, nous vous recommandons de contacter le responsable de la bibliothèque en lui fournissant les données de votre rapport pour lui montrer comment ses règles actuelles affectent les scores d'optimisation de votre application. S'il s'agit d'une bibliothèque externe, recherchez les bugs existants dans la bibliothèque avant de signaler des problèmes.
- Si nécessaire, vous pouvez tester les améliorations potentielles en filtrant les règles d'une bibliothèque spécifique. Vous pouvez importer les règles de la bibliothèque dans votre projet, exclure les règles générales et réexécuter l'analyseur de configuration pour mesurer les gains potentiels en termes de taille et de performances.
Règles subsumées
Il peut arriver que plusieurs règles de conservation se chevauchent et que l'une d'elles empêche une optimisation plus poussée que nécessaire. Si votre codebase contient deux règles de conservation.
# Prevents optimization in the entire package
# Remove this to improve optimization
-keep class com.example.package.** { *; }
# Prevents optimization to the class inside the package
-keep class com.example.package.Myclass
La première règle de conservation, qui empêche l'optimisation dans l'ensemble du package, englobe la deuxième règle de conservation, qui cible une classe à l'intérieur du package conservé par la première règle de conservation. Lorsque des règles de conservation se chevauchent, l'une d'elles peut bloquer plus d'optimisations que nécessaire. En affinant ces règles qui se chevauchent, vous pouvez maximiser l'optimisation R8 et éliminer la dette technique. Ce processus implique de simplifier votre configuration pour ne conserver que le code essentiel, tout en exploitant pleinement les capacités d'optimisation de R8.
Optimiser les règles subsumées
- Recherchez les règles de conservation englobantes à l'aide de l'outil d'analyse de la configuration R8.
- Identifiez les classes, les champs ou les méthodes exacts de votre code qui reposent réellement sur la réflexion et qui doivent être conservés à l'aide de règles de conservation. Cela vous aidera à affiner les règles de conservation.
- À l'aide de l'analyseur de configuration, comparez l'impact de chaque règle ciblant les mêmes classes, champs ou méthodes. Vous pouvez utiliser le pourcentage d'optimisation empêché par chaque règle de conservation pour identifier les règles de conservation larges et celles qui sont étroites.
- Si la règle de restriction est écrite avec précision (en ne conservant que les membres ou les classes auxquels on accède par réflexion), supprimez la règle de conservation plus large. Cela déverrouille les optimisations R8 de manière sécurisée pour le reste de votre package.
- Si la règle générale cible les bonnes classes, conservez-la et supprimez la règle précise. La règle étroite n'est qu'un encombrement redondant. Veillez à affiner la règle générale pour ne cibler que les classes, les champs ou les méthodes que vous avez identifiés.
Vérifiez et testez vos modifications : réexécutez l'analyseur de configuration pour vous assurer que le conflit est résolu. Ensuite, compilez une version et testez vos modifications pour vous assurer que le codebase fonctionne comme prévu.
Supprimer les règles inutiles
À l'aide de l'analyseur de configuration, vous pouvez auditer systématiquement votre code source pour identifier et supprimer les règles de conservation obsolètes qui encombrent votre configuration. L'analyseur de configuration R8 met en évidence deux sources principales de règles inutiles :
- Règles inutilisées : règles qui ne correspondent à aucune classe, méthode ni aucun champ dans votre build actuel. Elles persistent souvent après la refactorisation du code, la suppression des dépendances ou à partir de configurations copiées-collées qui ne sont plus pertinentes, ce qui ajoute une complexité de configuration inutile.
- Règles identiques : les règles de conservation identiques sont celles qui ciblent les mêmes classes, champs et méthodes, ou les déclarations en double de règles de conservation dans le même fichier de règles de conservation ou dans des fichiers différents.
Ces deux types de règles compliquent votre configuration, ce qui rend la maintenance et le débogage plus difficiles. En les identifiant, vous pouvez nettoyer votre configuration.