É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 Developer Relations

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.
image.png

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.

image.png

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.

image.png

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.

image.png

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.

Written by:
Continuer la lecture