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 les erreurs ANR.
Présentation de l'optimisation R8
R8 utilise un processus en plusieurs phases pour optimiser la taille et la vitesse de votre application. Les principales opérations sont les suivantes :
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
Activitiesou lesServicesdé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. Les principales techniques sont les suivantes :
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.MyActivitypeut devenira.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, utilisez le DSL approprié en fonction de la version AGP de votre projet. Nous vous recommandons 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.
Pour les versions AGP 9.3 et ultérieures
Pour activer l'optimisation de l'application pour AGP 9.3 et versions ultérieures :
- Définissez
enable = truedans le blocoptimizationdu script de build au niveau de l'application de votre build. - Ajoutez vos règles de conservation à un fichier avec le suffixe
.keepdans l'src/<variant>/keepRulesensemble de sources. Par exemple,src/main/keepRules/custom-rules.keep.
Kotlin
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Groovy
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
Ancien DSL pour les versions AGP antérieures à 9.3
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 build release
. Nous vous recommandons d'activer systématiquement les deux paramètres.
Ancien DSL (Kotlin)
android {
buildTypes {
release {
// Enables code optimizations.
isMinifyEnabled = true
// Enables resource shrinking.
isShrinkResources = true
proguardFiles(
// Default file with automatically generated optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
...
}
}
...
}
Ancien DSL (Groovy)
android {
buildTypes {
release {
// Enables code optimizations.
minifyEnabled = true
// Enables resource shrinking.
shrinkResources = true
// Default file with automatically generated optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
Améliorer l'optimisation R8
Les avantages en termes de performances de R8 sont directement liés à la quantité de code que R8 est en mesure d'optimiser. Pour tirer le meilleur parti de R8, suivez les bonnes pratiques :
- Activer R8 en mode complet
- Activer l'obscurcissement, l'optimisation et la minification
- Activer la réduction des ressources et la réduction optimisée des ressources
- Affiner les règles de conservation pour permettre une optimisation maximale des classes, des champs et des méthodes.
Pour vous aider à affiner les règles de conservation, 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 AGP 9.3.0-alpha05 ou à partir de la version R8 9.3.7-dev. Pour en savoir plus, consultez la section Analyser la configuration R8.
Optimiser la réduction des ressources pour des applications encore plus compactes
La version 8.12.0 d'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 :
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 :
bash 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 :
- Ajoutez des règles de conservation pour que certains codes restent intacts.
- Adoptez les optimisations de manière incrémentielle.
- Mettez à jour votre code pour utiliser des bibliothèques mieux adaptées à l' optimisation.
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.
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 AGP | Fonctionnalités introduites |
|---|---|
| 9.3 |
DSL simplifié : le nouveau bloc `optimization {}` nécessite moins de configuration. La réduction optimisée des ressources est toujours activée et les règles de conservation Android par défaut sont désactivées.
Ensemble de sources`keepRules` : si vous utilisez le nouveau DSL, vous devez placer vos règles de conservation dans l'ensemble de sources src/<variant>/keepRules, dans des fichiers avec le suffixe .keep. Les ensembles de sources sont également compatibles avec l'ancien DSL.
Règles de consommateur KMP (Kotlin MultiPlatform) : KMP ne nécessite plus de définir publish = true et est compatible avec l'ensemble de sources src/<variant>/keepRules avec l'extension .keep.
Notez que l'ancien DSL est toujours compatible. |
| 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 la section 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 secteurs 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 la taille qui en résulte permet de réduire les 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'erreurs ANR. Filtrage des règles de bibliothèque : la compatibilité avec les 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 la section 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 la section 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 la section Optimiser des packages spécifiés avec packageScope.Optimisé par défaut : la compatibilité avec 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 : compatibilité 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 : compatibilité avec le 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.
|