Études de cas

Comment Reddit a utilisé l'optimiseur R8 pour améliorer considérablement ses performances

Temps de lecture : 4 min
Voir le profil de Ben Weiss
Ben Weiss Ingénieur en relations avec les développeurs

Dans le monde actuel des applications mobiles, une expérience utilisateur fluide n'est pas qu'une fonctionnalité, c'est une nécessité. Les temps de chargement lents, les interfaces non réactives et l'instabilité peuvent constituer des obstacles importants à l'engagement et à la fidélisation des utilisateurs. Lors de sa collaboration avec l'équipe Android Developer Relations, l'équipe d'ingénieurs 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 important et a décidé de prendre les mesures nécessaires pour exploiter pleinement 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 essentiel pour optimiser les performances sur Android. Plusieurs étapes sont nécessaires pour améliorer les performances d'une application.Examinons rapidement les plus importantes.

  • 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 des classes et d'autres stratégies sont appliquées pour rendre le code plus compact. À ce stade, il ne s'agit plus de la lisibilité du code source par les humains, 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 pas d'importance ici et seront supprimées.
  • La minification 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 obtenir une classe appelée "a".
  • La réduction des ressources  supprime les ressources inutilisées telles que les fichiers XML et les éléments graphiques pour réduire davantage la taille de l'application.
image.png

Principales étapes de l'optimisation R8

Des données brutes à la satisfaction des utilisateurs : identifier le succès en production

Reddit a constaté une amélioration des performances immédiatement après le déploiement d'une nouvelle version de l'application auprès des utilisateurs. En utilisant Android Vitals et Crashlytics, Reddit a pu capturer des métriques de performances sur de vrais appareils avec de vrais utilisateurs, ce qui lui a permis de comparer la nouvelle version aux versions précédentes.

image.png

Comment R8 a amélioré les performances de l'application Reddit

L'équipe a observé 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 essentielles pour la satisfaction des utilisateurs. Un démarrage plus rapide signifie moins d'attente et un accès plus rapide au contenu. Moins d'ANR signifie une application plus stable et plus fiable, ce qui réduit la frustration des utilisateurs. Un rendu des frames plus fluide élimine les saccades de l'UI, ce qui rend le défilement et les animations fluides et réactifs. Cet impact technique positif était également clairement visible dans le sentiment des utilisateurs.

Les indicateurs de satisfaction des utilisateurs concernant le succès de l'optimisation étaient directement visibles sur le Google Play Store. Après le déploiement de la version optimisée pour R8, l'équipe a constaté un changement spectaculaire et positif dans le sentiment et l'engagement des utilisateurs.

image.png

Drew Heavner : "Outil permettant d'exploiter tout le potentiel de R8 dans moins de deux semaines"

Plus impressionnant encore, cela a été accompli grâce à un effort ciblé. Drew Heavner, ingénieur logiciel chez Reddit qui a travaillé sur cette initiative, a indiqué que l'implémentation des modifications pour exploiter tout le potentiel de R8 avait pris moins de deux semaines.

Confirmer les gains : analyse approfondie avec les macrobenchmarks

Après avoir constaté des améliorations concrètes significatives, l'équipe d'ingénierie de Reddit et l'équipe Android Developer Relations de Google ont effectué des benchmarks détaillés 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 : l'une sans optimisations et l'autre appliquant R8, ainsi que deux autres outils d'optimisation des performances fondamentaux : Profils de référence et Profils de démarrage.

Les profils de référence déplacent efficacement les étapes de compilation Just in Time (JIT) des appareils des utilisateurs vers les machines des développeurs. Il a été prouvé que le code compilé Ahead Of Time (AOT) généré permet de réduire le temps de démarrage et les problèmes de rendu.

Lorsqu'une application est empaquetée, le dexer d8 prend les classes et les méthodes, puis construit les fichiers classes.dex de votre application. Lorsqu'un utilisateur ouvre l'application, ces fichiers DEX sont chargés les uns après les autres jusqu'à ce que l'application puisse démarrer. En fournissant un profil de démarrage, vous indiquez à d8 les classes et les méthodes à inclure 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 était l'outil principal de cette phase, car il permettait de mesurer précisément les interactions utilisateur dans un environnement contrôlé. Pour simuler un parcours utilisateur typique, ils ont utilisé l'API UIAutomator pour 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.

Pour écrire le benchmark, il suffisait de faire ceci :

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

Les données de référence ont confirmé les observations sur le terrain et fourni des insights plus approfondis. 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 montré une réduction des deux tiers des occurrences de compilation juste à temps (JIT) et une diminution d'un tiers du temps de compilation JIT. Le rendu des frames a été amélioré, ce qui a permis de rendre 19% de frames en plus au cours du parcours utilisateur de référence. Enfin, la taille de l'application a été réduite de plus d'un tiers.

image.png

Améliorations générales des performances de Reddit

Vous pouvez mesurer le temps de compilation JIT avec une métrique de section de trace Macrobenchmark personnalisée comme celle-ci :

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

Activer la technologie à l'origine de 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 version.

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

Cette étape doit être suivie de tests complets de bout en bout, car les optimisations des performances peuvent entraîner des comportements indésirables, qu'il est préférable de détecter avant que vos utilisateurs ne le fassent.

Comme indiqué précédemment dans cet article, R8 effectue des optimisations importantes 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 entraînent 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.

Suivre l'exemple de Reddit dans votre application

Le succès de Reddit avec R8 constitue une étude de cas intéressante pour toute équipe de développement souhaitant améliorer considérablement 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 souligne l'importance de l'optimisation des performances.

En suivant le plan décrit dans cette étude de cas (en utilisant des outils tels que le score de performances de l'application pour identifier les opportunités, en exploitant tout le potentiel d'optimisation de R8, en surveillant les données réelles et en utilisant des benchmarks pour confirmer et approfondir la compréhension), d'autres développeurs peuvent obtenir des résultats similaires.

Pour commencer à utiliser R8 dans votre propre application, consultez la documentation et les conseils officiels récemment mis à jour sur l'activation, la configuration et le dépannage de l'optimiseur R8.

Écrit par :
Continuer la lecture