Comment Reddit a utilisé l'optimiseur R8 pour améliorer considérablement ses performances
Temps de lecture : 4 min
Dans le monde actuel des applications mobiles, une expérience utilisateur fluide n'est pas qu'une simple fonctionnalité : c'est une nécessité. Les temps de chargement lents, les interfaces qui ne répondent pas et l'instabilité peuvent constituer des obstacles importants à l'engagement et à la rétention des utilisateurs. En collaborant avec l'équipe Relations avec les développeurs Android, l'équipe d'ingénierie de Reddit a utilisé le score de performances de l'application pour évaluer son application. Après avoir évalué ses performances, elle a identifié un potentiel d'amélioration significatif et a décidé de prendre les mesures nécessaires pour exploiter tout le potentiel de R8, l'optimiseur d'applications Android. Cette initiative ciblée a permis d'améliorer considérablement les temps de démarrage, de réduire les frames lents ou figés et les ANR, et d'augmenter globalement les notes sur le Play Store. Cette étude de cas explique comment Reddit a obtenu ces résultats impressionnants.
Comment l'optimiseur R8 a aidé Reddit
L'optimiseur R8 est un outil fondamental pour optimiser les performances sur Android. Il existe plusieurs façons d'améliorer les performances d'une application.Examinons rapidement les plus efficaces.
- Le tree shaking est l'étape la plus importante pour réduire la taille d'une application. Le code inutilisé des dépendances de l'application et de l'application elle-même est supprimé.
- L'intégration de méthodes remplace les appels de méthode par le code réel, ce qui améliore les performances de l'application.
- La fusion de classes et d'autres stratégies sont appliquées pour rendre le code plus compact. À ce stade, il ne s'agit plus de rendre le code source lisible par l'humain, mais de faire en sorte que le code compilé fonctionne rapidement. Les abstractions, telles que les interfaces ou les hiérarchies de classes, n'ont donc pas d'importance ici et seront supprimées.
- La minimisation des identifiants remplace les noms des classes, des champs et des méthodes par des noms plus courts et sans signification. Ainsi, au lieu de
MyDataModel, vous pourriez vous retrouver avec une classe appelée "a". - La réduction des ressources supprime les ressources inutilisées, telles que les fichiers XML et les drawables, afin de réduire davantage la taille de l'application.
Principales étapes de l'optimisation R8
Des données brutes à la satisfaction des utilisateurs : identifier la réussite en production
Reddit a constaté une amélioration des performances dès le déploiement d'une nouvelle version de l'application auprès des utilisateurs. En utilisant Android Vitals et Crashlytics, Reddit a pu collecter des métriques de performances sur des appareils réels avec des utilisateurs réels, ce qui lui a permis de comparer la nouvelle version aux versions précédentes.
Comment R8 a amélioré les performances de l'application Reddit
L'équipe a constaté un démarrage à froid 40% plus rapide, une réduction de 30% des erreurs "L'application ne répond pas" (ANR), une amélioration de 25% du rendu des frames et une réduction de 14% de la taille de l'application.
Ces améliorations sont cruciales pour la satisfaction des utilisateurs. Un démarrage plus rapide signifie moins d'attente et un accès plus rapide au contenu. Moins d'erreurs ANR se traduisent par une application plus stable et plus fiable, ce qui réduit la frustration des utilisateurs. Un rendu d'image plus fluide élimine les saccades de l'interface utilisateur, ce qui rend le défilement et les animations fluides et réactifs. Cet impact technique positif s'est également traduit par une amélioration de l'avis des utilisateurs.
Les indicateurs de satisfaction des utilisateurs concernant l'optimisation étaient directement visibles sur le Google Play Store. Après le déploiement de la version optimisée par R8, l'équipe a constaté une amélioration spectaculaire de l'opinion et de l'engagement des utilisateurs.
Drew Heavner : "Il nous a fallu moins de deux semaines pour exploiter tout le potentiel de R8"
Plus impressionnant encore, ce résultat a été obtenu grâce à un effort ciblé. Drew Heavner, ingénieur logiciel chez Reddit qui a travaillé sur cette initiative, a indiqué qu'il avait fallu moins de deux semaines pour implémenter les modifications permettant d'exploiter tout le potentiel de R8.
Confirmer les gains : analyse approfondie avec les macrobenchmarks
Après avoir constaté des améliorations significatives en conditions réelles, l'équipe d'ingénierie de Reddit et l'équipe Relations avec les développeurs Android de Google ont effectué des analyses comparatives détaillées pour confirmer scientifiquement les gains et tester d'autres optimisations. Pour cette analyse, l'équipe d'ingénierie de Reddit a fourni deux versions de son application : une sans optimisations et une autre qui appliquait R8 et deux autres outils d'optimisation des performances fondamentaux : les profils de référence et les profils de démarrage.
Les profils de référence déplacent efficacement les étapes de compilation juste-à-temps (JIT) des appareils des utilisateurs vers les ordinateurs des développeurs. Il a été prouvé que le code compilé Ahead Of Time (AOT) généré réduit à la fois le temps de démarrage et les problèmes d'affichage.
Lorsqu'une application est empaquetée, le dexer d8 prend les classes et les méthodes, puis crée les fichiers classes.dex de votre application. Lorsqu'un utilisateur ouvre l'application, ces fichiers dex sont chargés l'un après l'autre jusqu'à ce que l'application puisse démarrer. En fournissant un profil de démarrage, vous indiquez à d8 les classes et les méthodes à empaqueter dans les premiers fichiers classes.dex. Cette structure permet à l'application de charger moins de fichiers, ce qui améliore la vitesse de démarrage.
Jetpack Macrobenchmark a été l'outil principal de cette phase, permettant de mesurer précisément les interactions utilisateur dans un environnement contrôlé. Pour simuler un parcours utilisateur classique, ils ont utilisé l'API UIAutomator afin de créer un test qui ouvrait l'application, faisait défiler l'écran vers le bas trois fois, puis le faisait défiler vers le haut.
Au final, tout ce dont nous avions besoin pour écrire le benchmark était ceci :
uiAutomator {
startApp(REDDIT)
repeat(3) {
onView { isScrollable }.fling(Direction.DOWN) }
repeat(3) {
onView {isScrollable }.fling(Direction.UP)
}
}Les données de benchmark ont confirmé les observations sur le terrain et ont fourni des insights plus détaillés. L'application entièrement optimisée démarrait 55% plus rapidement, et les utilisateurs pouvaient commencer à naviguer 18% plus tôt. L'application optimisée a également enregistré une réduction de deux tiers des occurrences de compilation JIT (Just-In-Time) et une diminution d'un tiers du temps de compilation JIT. Le rendu des frames a été amélioré, ce qui a permis d'afficher 19% de frames en plus au cours du parcours utilisateur évalué. Enfin, la taille de l'application a été réduite de plus d'un tiers.
Amélioration des performances globales de Reddit
Vous pouvez mesurer le temps de compilation JIT avec une métrique de section de trace Macrobenchmark personnalisée, comme suit :
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")Activer la technologie derrière la transformation : R8
Pour activer R8 en mode complet, configurez votre fichier app/build.gradle.kts en définissant minifyEnabled et shrinkResources sur true dans le type de compilation de release.
android {
...
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"keep-rules.pro",
)
}
}
}Cette étape doit être suivie de tests de bout en bout complets, car les optimisations des performances peuvent entraîner un comportement indésirable, qu'il est préférable de détecter avant vos utilisateurs.
Comme indiqué précédemment dans cet article, R8 effectue des optimisations approfondies 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 provoquent 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.
Suivez l'exemple de Reddit dans votre application
Le succès de Reddit avec R8 est une étude de cas intéressante pour toute équipe de développement qui souhaite améliorer de manière significative les performances de son application, sans trop d'efforts. La corrélation directe entre les améliorations techniques et l'augmentation de la satisfaction des utilisateurs qui en découle souligne l'importance de l'optimisation des performances.
En suivant le plan présenté dans cette étude de cas (utiliser des outils tels que le score de performances de l'application pour identifier les opportunités, exploiter tout le potentiel d'optimisation de R8, surveiller les données réelles et utiliser des benchmarks pour confirmer et approfondir la compréhension), d'autres développeurs peuvent obtenir des gains similaires.
Pour commencer à utiliser R8 dans votre propre application, consultez la documentation officielle et les conseils récemment mis à jour sur l'activation, la configuration et le dépannage de l'optimiseur R8.
-
Études de casMonzo est une banque numérique britannique qui compte 15 millions de clients et qui ne cesse de se développer. À mesure que l'application s'est développée, l'équipe d'ingénierie a identifié le temps de démarrage de l'application comme un domaine d'amélioration essentiel, mais craignait que cela ne nécessite des modifications importantes de sa codebase.
Ben Weiss, Tracy Agyemang • Temps de lecture : 2 min -
Études de casGrab est la super-application leader en Asie du Sud-Est. Elle propose des services de livraison, de mobilité et des services financiers à des millions d'utilisateurs dans huit pays via une seule application.
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • Temps de lecture : 5 min -
Études de casL'équipe a créé un codebase d'UI basé sur l'IA 50% plus petit que l'implémentation d'origine, tout en réduisant de 35% le temps d'exécution de l'agent IA, de 32% les échanges entre l'ingénieur et l'agent, et de 33% le coût des jetons.
Pavlo Stavytskyi, Rebecca Franks • Temps de lecture : 11 min
Recevez chaque semaine les dernières informations sur le développement Android dans votre boîte de réception.