Profils d'image de démarrage

Android 11 ou version ultérieure permet de générer des profils d'image de démarrage, qui encapsulent des informations sur le code de divers composants au niveau du système, tels que le serveur système et le chemin d'accès au démarrage. Android Runtime (ART) utilise ces informations pour effectuer des optimisations à l'échelle du système, dont certaines sont essentielles aux performances d'Android et ont un impact sur l'exécution de tout code non natif (niveau système ou application). Dans certains cas, les profils d'image de démarrage peuvent avoir un impact sur les performances d'exécution et la consommation de mémoire de plusieurs dizaines de pour cent.

Obtenir des informations sur le profil de démarrage

Les profils d'image de démarrage sont dérivés des profils des applications exécutées lors des parcours utilisateur critiques. Dans une configuration d'appareil spécifique, ART capture (dans le cadre des profils JIT) les méthodes et les classes du chemin d'accès au démarrage utilisées par les applications, puis enregistre ces informations dans le profil de l'application (par exemple, /data/misc/profiles/cur/0/com.android.chrome/primary.prof), où elles sont indexées par le fichier Dalvik EXecutable (DEX) du chemin d'accès au démarrage (voir Format de profil ART).

Examinez les profils d'application enregistrés pendant les parcours utilisateur critiques pour déterminer quelle partie du chemin d'accès au démarrage est la plus utilisée et la plus importante à optimiser (voir Format de profil ART pour en savoir plus). L'inclusion de toutes les méthodes ou classes a un impact négatif sur les performances. Concentrez-vous donc sur les chemins de code les plus couramment utilisés. Par exemple, si une méthode du chemin d'accès au boot est utilisée par une seule application, elle ne doit pas faire partie des profils de démarrage. Chaque appareil doit configurer la sélection de la méthode/classe en fonction de la sélection de la CUJ et de la quantité de données produites par les tests.

Pour agréger les informations de chemin d'accès au chemin d'accès au démarrage de tous les profils d'application individuels sur l'appareil, exécutez la commande adb shell cmd package snapshot-profile android. Vous pouvez utiliser les informations agrégées comme base pour le traitement et la sélection de la méthode/classe sans agréger manuellement les profils individuels (bien que vous puissiez le faire si vous le souhaitez).

Profil de l'image de démarrage

Figure 1 : Procédure d'obtention des profils d'image de démarrage

Données de profil de l'image de démarrage

Les profils d'image de démarrage incluent les fichiers et données suivants.

  • Profil pour le classpath de démarrage (frameworks/base/config/boot-image-profile.txt). Détermine les méthodes du classpath de démarrage qui sont optimisées, la classe incluse dans l'image .art de démarrage et la mise en page des fichiers DEX correspondants.

  • Liste des classes préchargées. Détermine les classes préchargées dans Zygote.

  • Profil des composants du serveur système (frameworks/base/services/art-profile). Détermine les méthodes du serveur système qui sont optimisées/compilées, la classe incluse dans l'image .art de démarrage et la mise en page des fichiers DEX correspondants.

Format de profil ART

Le profil ART capture des informations sur chacun des fichiers DEX chargés, y compris des informations sur les méthodes à optimiser et les classes utilisées au démarrage. Lorsque le profilage d'image de démarrage est activé, ART inclut également le chemin d'accès au chemin d'accès au démarrage et les fichiers JAR du serveur système dans le profil, et annote chaque fichier DEX avec le nom du package qui l'utilise.

Par exemple, videz le profil d'image de démarrage brut à l'aide de la commande suivante:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

Vous obtenez un résultat semblable à celui-ci:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

Dans l'exemple ci-dessus:

  • core-oj.jar est utilisé par com.google.android.ext.services et com.android.systemui. Chaque entrée liste les deux packages utilisés à partir de core-oj.jar.

  • Les deux processus utilisent la méthode avec l'index DEX 520, mais seul le processus systemui utilise la méthode avec l'index DEX 521. Le même raisonnement s'applique aux autres sections de profil (par exemple, les classes de démarrage).

Lors du traitement des données, filtrez les méthodes/classes en fonction de l'utilisation, en donnant la priorité aux processus au niveau du système (par exemple, le serveur système ou systemui) ou aux méthodes qui ne sont pas couramment utilisées, mais qui sont néanmoins importantes (par exemple, les méthodes utilisées par l'application Appareil photo).

Le format de profil annote en interne chaque méthode avec plusieurs indicateurs (démarrage, post-démarrage, chaleur, abi), ce qui est plus que ce qui est affiché dans le format de vidage uniquement. Pour utiliser tous les signaux, modifiez les scripts disponibles.

Recommandations

Pour obtenir de meilleurs résultats, suivez les consignes ci-dessous.

  • Déployez la configuration de génération de profils d'image de démarrage sur plusieurs appareils de test et agrégez les résultats avant de générer le profil d'image de démarrage final. L'outil profman permet d'agréger et de sélectionner plusieurs profils d'image de démarrage, mais il ne fonctionne qu'avec la même version de l'image de démarrage (même chemin d'accès au classpath de démarrage).

  • Accordez la priorité de sélection aux méthodes/classes utilisées par les processus système. Ces méthodes/classes peuvent utiliser du code qui n'est pas souvent utilisé par d'autres applications, mais qui est néanmoins essentiel à optimiser.

  • La forme des données d'une exécution sur un seul appareil est très différente de celle des appareils de test qui exécutent des CUJ réels. Si vous ne disposez pas d'un grand parc d'appareils de test, utilisez le même appareil pour exécuter plusieurs CUJ afin d'augmenter la probabilité que les optimisations de profil d'image de démarrage fonctionnent correctement en production (ce scénario est décrit ci-dessous).

Configurer les appareils

Pour activer la configuration du profil de démarrage via les propriétés système, utilisez l'une des méthodes suivantes.

  • Option 1:Configurer manuellement les accessoires (fonctionne jusqu'au redémarrage):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
  • Option 2:Utilisez un local.prop (effet permanent jusqu'à la suppression du fichier). Voici la marche à suivre :

    1. Créez un fichier local.prop avec le contenu suivant:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Exécutez les commandes suivantes :

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
  • Option 3:utilisez la configuration de l'appareil pour définir les propriétés côté serveur suivantes:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

Générer des profils d'images de démarrage

Suivez les instructions ci-dessous pour générer un profil d'image de démarrage de base à l'aide de tests sur un seul appareil.

  1. Configurez l'appareil.

    1. Configurez l'appareil comme décrit dans la section Configurer les appareils.

    2. (Facultatif) Le nouveau format de profil prend du temps à nettoyer et à remplacer les autres profils. Pour accélérer la collecte de profils, réinitialisez tous les profils de l'appareil.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. Exécutez les CUJ sur l'appareil.

  2. Capturez le profil à l'aide de la commande suivante:

    adb shell cmd package snapshot-profile android
  3. Extrayez le profil à l'aide de la commande suivante:

    adb pull /data/misc/profman/android.prof
  4. Accédez aux fichiers JAR du classpath de démarrage à l'aide des commandes suivantes:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. Générez le profil d'image de démarrage à l'aide de la commande profman suivante.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. À l'aide de données, ajustez la commande profman à l'aide des options de seuil de sélection disponibles.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    Pour obtenir la liste complète, consultez la page d'aide ou le code source de profman.