Études de cas

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

Temps de lecture : 4 min
Ben Weiss
Ingénieur chargé des 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 le nombre de frames lents ou figés et d'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 de 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 pouvez obtenir une classe nommée "a".
  • La réduction des ressources  supprime les ressources inutilisées telles que les fichiers XML et les éléments drawables 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 immédiate des performances 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'erreurs ANR signifie une application plus stable et plus fiable, ce qui réduit la frustration des utilisateurs. Le 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 par R8, l'équipe a constaté un changement radical et positif dans le sentiment et l'engagement des utilisateurs.

image.png

Drew Heavner : "Outil permettant d'exploiter tout le potentiel de R8 disponible 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 significatives dans le monde réel, 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 : 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 Just in Time (JIT) des appareils des utilisateurs vers les machines des développeurs. Le code compilé Ahead Of Time (AOT) généré a prouvé qu'il permettait de réduire à la fois 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, permettant 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 informations plus approfondies. L'application entièrement optimisée a démarré 55% plus rapidement et les utilisateurs ont pu 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. L'affichage des frames a été amélioré, ce qui a permis de générer 19% de frames en plus au cours du parcours utilisateur testé. 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 vos utilisateurs.

Comme indiqué précédemment dans cet article, R8 effectue de nombreuses optimisations 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.

Suivez 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 qui s'en est suivie souligne l'importance de l'optimisation des performances.

En suivant le plan présenté dans cette étude de cas (en utilisant des outils comme le score de performances des applications 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 :

Lire la suite