Profils d'image de démarrage

Android 11 ou version ultérieure prend en charge la génération de 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 de classe de 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 le code non natif (au niveau du système ou de l'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 selon des pourcentages à deux chiffres.

Obtenir des informations sur le profil de démarrage

Les profils d'image de démarrage sont dérivés des profils d'applications exécutées lors des parcours utilisateur critiques (CUJ). Dans une configuration d'appareil spécifique, ART capture (dans le cadre des profils JIT) les méthodes de chemin de classe de démarrage et les classes 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ù il est indexé par le fichier Dalvik EXecutable (DEX) du chemin de classe de démarrage (voir ART profile format ).

Examinez les profils d'application enregistrés lors des CUJ pour déterminer quelle partie du chemin de classe de démarrage est la plus utilisée et la plus importante à optimiser (pour un exemple, voir ART profile format ). L’inclusion de toutes les méthodes ou classes affecte négativement les performances, concentrez-vous donc sur les chemins de code les plus couramment utilisés. Par exemple, si une méthode du chemin de classe de démarrage 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 méthode/classe en fonction de la sélection CUJ et de la quantité de données produites par les tests.

Pour regrouper les informations sur le chemin de classe de 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 méthode/classe sans agréger manuellement les profils individuels (bien que vous puissiez le faire si vous le souhaitez).

Profil d'image de démarrage

Figure 1. Processus d'obtention des profils d'image de démarrage

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

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

  • Profil pour le chemin de classe de démarrage ( frameworks/base/config/boot-image-profile.txt ). Détermine quelles méthodes du chemin de classe de démarrage sont optimisées, quelle classe est incluse dans l'image .art de démarrage et comment les fichiers DEX correspondants sont disposés.

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

  • Profil pour les composants du serveur système ( frameworks/base/services/art-profile ). Détermine quelles méthodes du serveur système sont optimisées/compilées, quelle classe est incluse dans l'image .art de démarrage et comment les fichiers DEX correspondants sont disposés.

Format de profil ART

Le profil ART capture des informations de chacun des fichiers DEX chargés, y compris des informations sur les méthodes à optimiser et les classes utilisées lors du démarrage. Lorsque le profilage de l'image de démarrage est activé, ART inclut également le chemin de classe de 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 de l'image de démarrage brute avec la commande suivante :

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

Cela produit un résultat similaire à :

=== 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 répertorie 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. La même logique s'applique aux autres sections de profil (par exemple, les classes de démarrage).

Pendant le traitement des données, filtrez les méthodes/classes en fonction de leur 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 peut-être pas couramment utilisées mais qui sont néanmoins importantes (par exemple, les méthodes utilisées par le application appareil photo).

Le format de profil annote en interne chaque méthode avec plusieurs indicateurs (démarrage, post-démarrage, hotness, 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

Utilisez les directives suivantes pour de meilleurs résultats.

  • Déployez la configuration pour générer des profils d'image de démarrage sur plusieurs appareils de test et regroupez les résultats avant de générer le profil d'image de démarrage final. L'outil profman prend en charge l'agrégation et la sélection de 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 de classe de démarrage).

  • Donnez 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 dont l'optimisation reste essentielle.

  • La forme des données provenant d’une seule exécution d’appareil est très différente de celle des appareils de test qui exécutent des CUJ du monde réel. Si vous ne disposez pas d'un grand parc de périphériques de test, utilisez le même périphérique pour exécuter plusieurs CUJ afin d'augmenter la confiance dans le bon fonctionnement des optimisations du profil de l'image de démarrage 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). Faire cela:

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

      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 : Utiliser la configuration de l'appareil pour définir les propriétés suivantes côté serveur :

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

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

Utilisez les instructions suivantes 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 Configuration des appareils .

    2. (Facultatif) Le nouveau format de profil prend du temps pour nettoyer et remplacer les autres profils. Pour accélérer la collecte de profils, réinitialisez tous les profils sur 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 chemin de classe de démarrage à l'aide des commandes suivantes :

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. Générez le profil de l'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 des données, modifiez la commande profman à l'aide des indicateurs de seuil de sélection disponibles.

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

    Pour afficher la liste complète, reportez-vous à la page d'aide profman ou au code source.