L'analyseur de configuration R8 est un outil conçu pour vous aider à maximiser les avantages de R8 en vous fournissant 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, en particulier les scores de minification, d'optimisation et d'obscurcissement, qui indiquent le pourcentage de votre base de code 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
À partir d'AGP 9.3.0-alpha05 et versions ultérieures, le rapport est généré automatiquement dans
build/outputs/mapping/release/configanalyzer.html lors de l'exécution d'une compilation R8. Pour désactiver la génération automatique des sorties, définissez la propriété Gradle suivante :
android.experimental.r8.enableR8ConfigurationAnalyzer=false
Pour AGP 9.2 et versions antérieures, définissez la
com.android.tools.r8.dumpkeepradiushtmltodirectory propriété système 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'analyseur de configuration R8 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 permet d'obtenir une optimisation maximale de R8, ce qui améliore les performances de l'application. Utilisez les scores suivants pour comprendre la quantité de votre base de code disponible pour l'optimisation par R8.
Score de minification
Lorsque R8 réduit la taille de votre application, il identifie et élimine le code et les ressources inutilisés, ce qui garantit que votre compilation finale est aussi légère que possible. Le score de minification suit le pourcentage de classes, de champs et de méthodes soumis à la minification. Par exemple, un score de minification de 66% signifie que R8 peut effectuer une minification 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 score d'optimisation est de 66%, cela signifie que R8 ne peut effectuer une optimisation que dans 66% de votre base de 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 base de code.
Affiner les règles de conservation
Pour améliorer les scores et bénéficier d'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, les méthodes ou les 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 de détails.
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 de conservation, 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 ces informations pour identifier les règles de conservation 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 de conservation 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 de conservation pour voir 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 ne ciblant que 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 affectés par la règle de conservation, puis affinez les règles de conservation.
Inspecter l'optimisation des bibliothèques
Lorsque vous intégrez des bibliothèques tierces, elles incluent souvent leurs propres règles de conservation du consommateur pour fonctionner avec R8. Étant donné que 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. 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 du consommateur 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 grande quantité d'optimisation dans votre application.
Optimiser les bibliothèques
- Si une bibliothèque inclut une règle trop large, nous vous recommandons de contacter le responsable de la bibliothèque avec 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 des 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 larges 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 plus d'optimisation que nécessaire. Si votre base de code 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, subsume 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 les 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 rationaliser votre configuration pour vous assurer que seul le code essentiel est conservé tout en exploitant tout le potentiel des capacités d'optimisation de R8.
Optimiser les règles subsumées
- Recherchez les règles de conservation subsumées à l'aide de l'analyseur de configuration R8.
- Identifiez les classes, les champs ou les méthodes exacts de votre base de code qui dépendent réellement de la réflexion, qui doit être conservée à 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 celle qui est la plus large et celle qui est la plus étroite.
- Si la règle étroite est écrite avec précision (ne conservant que les membres ou les classes exacts auxquels vous accédez de manière réflexive), supprimez la règle de conservation plus large. Cela débloque en toute sécurité les optimisations R8 pour le reste de votre package.
- Si la règle large cible les bonnes classes, conservez-la et supprimez la règle étroite. La règle étroite n'est qu'un encombrement redondant. Veillez à affiner la règle large 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 la base de code fonctionne comme prévu.
Supprimer les règles inutiles
À l'aide de l'analyseur de configuration, vous pouvez auditer systématiquement votre base de code 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 ou aucun champ dans votre compilation actuelle. 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 : règles de conservation identiques qui ciblent les mêmes classes, champs et méthodes ou déclarations en double de règles de conservation dans un même fichier de règles de conservation ou dans plusieurs fichiers de règles de conservation.
Les deux types de règles encombrent votre configuration, ce qui rend la maintenance et le débogage plus difficiles. En les identifiant, vous pouvez nettoyer votre configuration.