Présentation des profils de référence

Les profils de référence améliorent la vitesse d'exécution du code d'environ 30 % dès le premier lancement en évitant l'interprétation et les étapes de compilation juste à temps (JIT) pour les chemins de code inclus.

En expédiant un profil de référence dans une application ou une bibliothèque, Android Runtime (ART) peut optimiser les chemins de code spécifiés via la compilation anticipée (ou compilation AOT), ce qui permet d'améliorer les performances pour chaque nouvel utilisateur et chaque mise à jour d'application. Cette optimisation guidée des profils (PGO) permet aux applications d'optimiser le démarrage, de réduire les à-coups d'interaction et d'améliorer les performances d'exécution globales pour les utilisateurs dès le premier lancement.

Ces améliorations des performances se traduisent directement par des métriques métier améliorées telles que la rétention des utilisateurs, les transactions et les notes. Pour en savoir plus concernant l'impact des performances sur les métriques métier, consultez les témoignages de Josh, Lyft, TikTok et Zomato.

Avantages des profils de référence

Les profils de référence fluidifient toutes les interactions utilisateur (telles que le démarrage de l'application, la navigation entre les écrans ou le défilement du contenu) dès leur première exécution. En augmentant la vitesse et la réactivité d'une application, les profils de référence peuvent entraîner une augmentation du nombre d'utilisateurs actifs par jour et du taux moyen de visiteurs de retour.

Les profils de référence contribuent à guider l'optimisation au-delà du démarrage de l'application en fournissant des interactions utilisateur courantes qui améliorent l'exécution dès le premier lancement. La compilation AOT guidée ne s'appuie pas sur les appareils des utilisateurs et peut être effectuée une fois pour chaque version sur un ordinateur de développement plutôt que sur un appareil mobile. En publiant des versions avec un profil de référence, les optimisations d'applications sont disponibles beaucoup plus rapidement qu'en utilisant uniquement les profils cloud.

Lorsque vous n'utilisez pas de profil de référence, le code de l'application fait l'objet d'une compilation JIT dans la mémoire après avoir été interprété, ou est écrit dans un fichier odex en arrière-plan lorsque l'appareil est inactif. Après avoir installé ou mis à jour une application, l'expérience utilisateur n'est pas optimale lors de la première exécution, jusqu'à ce que de nouveaux chemins de code soient optimisés. De nombreuses applications mesurent des améliorations des performances d'environ 30 % après optimisation.

Profils de démarrage

Les profils de démarrage sont semblables aux profils de référence, à la différence qu'ils sont utilisés au moment de la compilation plutôt que pour l'optimisation sur l'appareil. Un profil de démarrage permet d'optimiser la mise en page du fichier DEX afin d'améliorer les temps de démarrage. Le code identifié dans le profil de démarrage est placé dans le fichier classes.dex principal, tandis que l'autre code est placé dans des fichiers DEX distincts. Cela réduit les temps de démarrage en limitant le nombre de défaillances sur les pages lors du démarrage de l'application. Pour en savoir plus sur la manière dont les profils de démarrage et les optimisations de mise en page DEX peuvent améliorer les temps de démarrage de l'application, consultez Optimisations de mise en page DEX et profils de démarrage.

C'est parti

Pour commencer à optimiser les performances de votre application existante, consultez la page Créer des profils de référence.

La chaîne de dépendances fournit des versions stables et de développement. Pour générer et installer un profil de référence, utilisez les versions compatibles suivantes (ou versions ultérieures) du plug-in Android Gradle, de la bibliothèque Macrobenchmark et du programme d'installation de profil. Ces dépendances sont requises à différents moments et interagissent entre elles en tant que chaîne d'outils pour optimiser un profil de référence.

  • Plug-in Android Gradle : com.android.tools.build:8.0.0
  • Bibliothèque Macrobenchmark : androidx.benchmark:benchmark-macro-junit4:1.3.3
  • Programme d'installation de profil : androidx.profileinstaller:profileinstaller:1.4.1

Nous vous recommandons d'utiliser la dernière version d'AGP pour créer et gérer des profils de référence. Voici les principales fonctionnalités disponibles avec les différentes versions d'AGP :

Version d'AGP Fonctionnalités
8,4 Les installations d'applications locales de builds non débogables à l'aide de l'outil de ligne de commande Gradle wrapper ou d'Android Studio installent des profils de référence, de sorte que les performances de votre build de version locale correspondent plus étroitement à la production. Cette mise à jour n'affecte pas les performances de production des profils de référence.
8,3
  • Compatibilité complète avec les répertoires d'ensembles de sources (modules de bibliothèque) : déclarez plusieurs fichiers sources de profil de référence et utilisez des répertoires compatibles avec les variantes, tels que src/free/generated/baselineProfiles/baseline-prof1.txt, désormais également disponibles pour les modules de bibliothèque. et les modules d'appli.
  • Les profils de référence incluent les classes désucrées.
8.2
  • Réécriture R8 des règles : D8 et R8 peuvent transformer les règles de référence et du profil de démarrage lisibles par l'humain pour capturer toutes les règles dont vous avez besoin pour optimiser les performances de l'application. Augmente la couverture des profils de référence des méthodes d'environ 30 % et améliore les performances de l'application de près de 15 %.
  • Profils de démarrage : générez ce nouveau type de profil de référence pour gérer la mise en page du code dans DEX. Augmente les performances de démarrage d'environ 15 % supplémentaires, voire beaucoup plus pour les applications volumineuses.
8.0 Version minimale recommandée : utilisez le plug-in Baseline Profile Gradle pour générer des profils de référence en une seule tâche Gradle.
  • Compatibilité complète avec les répertoires d'ensembles de sources (modules d'appli) : déclarez plusieurs fichiers sources de profil de référence et utilisez des répertoires compatibles avec les variantes, tels que src/free/generated/baselineProfiles/baseline-prof1.txt.
7.4 Version minimale prise en charge : les applications peuvent utiliser des profils de référence à partir de bibliothèques et fournir leur propre profil de référence dans le fichier src/main/baseline-prof.txt.
  • Les profils de référence sont correctement empaquetés lors de la création de l'APK à partir d'un app bundle (problème n° 230361284).
  • Pour les applications comportant plusieurs fichiers .dex, les profils de référence sont correctement empaquetés pour le fichier .dex principal.

Exemple de génération de profil

Voici un exemple de classe permettant de créer un profil de référence pour le démarrage d'une application, ainsi que plusieurs événements de navigation et de défilement à l'aide de la bibliothèque Macrobenchmark recommandée :

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

Vous pouvez consulter ce code en contexte et plus de détails avec nos exemples de performances sur GitHub.

Éléments à inclure

Lorsque vous utilisez des profils de référence dans une application, vous pouvez inclure le code de démarrage de l'application et des interactions utilisateur courantes, comme la navigation entre les écrans ou le défilement. Vous pouvez également rassembler des flux entiers tels que l'inscription, la connexion ou le paiement. Tous les parcours utilisateur que vous jugez essentiels peuvent bénéficier des profils de référence en améliorant les performances d'exécution.

Si vous testez différentes approches pour améliorer les performances, envisagez d'inclure des profils de référence pour les deux groupes. De la sorte, vous facilitez l'interprétation de vos résultats en vous assurant que tous vos utilisateurs exécutent régulièrement du code compilé.

Les bibliothèques peuvent fournir leurs propres profils de référence et les distribuer avec des versions afin d'améliorer les performances des applications. Consultez la section Utiliser un profil de référence dans les performances de Jetpack Compose.

Fonctionnement des profils de référence

Lors du développement de votre application ou de votre bibliothèque, pensez à définir des profils de référence pour couvrir les interactions utilisateur courantes pour lesquelles le délai d'affichage ou la latence sont conséquents. Ils fonctionnent de la façon suivante :

  1. Les règles de profil lisibles par l'humain sont générées pour votre application et compilées dans un format binaire dans l'application. Elles se trouvent sur assets/dexopt/baseline.prof. Vous pouvez ensuite importer l'AAB sur Google Play selon la méthode habituelle.

  2. Google Play traite le profil et l'envoie directement aux utilisateurs avec l'APK. Lors de l'installation, ART effectue une compilation AOT des méthodes dans le profil, ce qui permet de les exécuter plus rapidement. Si le profil contient des méthodes utilisées lors du lancement de l'application ou lors de l'affichage des frames, l'utilisateur est susceptible de bénéficier d'un temps de lancement plus court et d'une diminution des à-coups.

  3. Ce flux coopère avec l'agrégation Cloud Profiles pour ajuster les performances en fonction de l'utilisation réelle de l'application au fil du temps.

Figure 1. Ce schéma montre le workflow de profil de référence de l'importation jusqu'à la livraison à l'utilisateur final, et la manière dont il est associé aux profils cloud.

Profils cloud

Les profils cloud offrent un moyen d'optimisation guidée des profils supplémentaire. Ils sont agrégés par le Google Play Store et distribués pour la compilation au moment de l'installation, avec les profils de référence.

Bien que les profils cloud soient basés sur des interactions utilisateur réelles avec l'application, leur distribution peut prendre plusieurs heures, voire plusieurs jours après une mise à jour, ce qui limite leur disponibilité. Tant que les profils ne sont pas entièrement distribués, les performances des applications ne sont pas optimales pour les utilisateurs de nouvelles applications ou d'applications mises à jour. De plus, les profils cloud ne sont compatibles qu'avec les appareils Android équipés d'Android 9 (niveau d'API 28) ou version ultérieure. Ils ne s'adaptent bien que pour les applications disposant d'une base d'utilisateurs suffisamment importante.

Comportement de la compilation sur les versions d'Android

Les versions de la plate-forme Android utilisent différentes approches de compilation, chacune offrant un compromis en termes de performances. Les profils de référence améliorent les méthodes de compilation précédentes en fournissant un profil pour toutes les installations.

Version d'Android Méthode de compilation Approche d'optimisation
5 à 6 (niveau d'API 21 à 23) AOT complète L'ensemble de l'application est optimisé lors de l'installation, ce qui augmente les temps d'attente ainsi que l'utilisation de la RAM et de l'espace disque, en plus de rallonger le temps de chargement du code, qui peut lui-même augmenter le temps de démarrage à froid.
7 à 8.1 (niveau d'API 24 à 27) AOT partiel (profil de référence) Les profils de référence sont installés par androidx.profileinstaller lors de la première exécution, au moment où le module d'application définit cette dépendance. ART peut améliorer encore ce processus en ajoutant des règles de profil supplémentaires lors de l'utilisation de l'application et en les compilant lorsque l'appareil est inactif. Cette approche optimise l'espace disque et le temps de chargement du code sur le disque, réduisant ainsi le temps d'attente de l'application.
9 (niveau d'API 28) ou version ultérieure AOT partielle (profil de référence + profil cloud) Play optimise les APK et les profils cloud (le cas échéant) à l'aide de profils de référence pendant les installations d'applications. Après l'installation, les profils ART sont importés dans Play et agrégés, puis fournis aux utilisateurs sous forme de profils cloud lorsqu'ils installent ou mettent à jour l'application.

Problèmes connus

Vous trouverez ci-dessous les problèmes possibles et leur solution, ou les problèmes pour lesquels des solutions de contournement sont en cours de développement :

  • La génération du profil de référence peut échouer en raison des paramètres d'autorisation sur certains appareils, y compris les appareils OnePlus. Pour contourner ce problème, désactivez l'option Désactiver la surveillance des autorisations dans les paramètres Options pour les développeurs.

  • La génération de profils de référence n'est pas prise en charge sur les appareils Firebase Test Lab, y compris les appareils Test Lab gérés par Gradle (problème 285187547).

  • Pour fournir correctement des profils de référence pour les bibliothèques, utilisez au minimum le plug-in Baseline Profile Gradle 1.2.3 ou AGP 8.3 (problème 313992099).

  • Si vous générez des profils de référence avec la commande ./gradlew app:generateBaselineProfile, les benchmarks du module de test s'exécutent également et les résultats sont supprimés. Dans ce cas, vous ne pouvez générer que les profils de référence en exécutant la commande avec -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Ce problème a été résolu dans AGP 8.2.

  • La commande permettant de générer des profils de référence pour tous les types de compilation (./gradlew app:generateBaselineProfile) ne génère des profils de référence que pour le type de compilation de version. Ce problème a été résolu dans AGP 8.1.

  • Les canaux de distribution d'application autres que le Google Play Store peuvent ne pas être compatibles avec les profils de référence lors de l'installation. Les utilisateurs des applications installées via ces canaux ne constateront pas les avantages tant que dexopt ne s'exécutera pas en arrière-plan (probablement pendant la nuit).

  • Le partage interne d'application sur le Play Store n'est pas compatible avec les profils de référence. Toutefois, c'est le cas pour le canal de test interne.

  • Les optimisations de batterie sur certains appareils, tels que les appareils Huawei, peuvent interférer avec l'installation du profil. Pour vous assurer que vos profils sont correctement installés, désactivez l'optimisation de la batterie sur vos appareils de référence.

Ressources supplémentaires