Implémenter le compilateur ART juste-à-temps

L'environnement d'exécution Android (ART) inclut un compilateur JIT (Just-in-Time) avec profilage de code qui améliore continuellement les performances des applications Android au fur et à mesure de leur exécution. Le compilateur JIT complète le compilateur AOT actuel d'ART et améliore les performances d'exécution, économise de l'espace de stockage et accélère l'application et les mises à jour du système. Il améliore également le compilateur AOT en évitant les systèmes Ralentissement lors des mises à jour automatiques des applications ou de la recompilation des applications lors des mises à jour Over The Air (OTA).

Bien que JIT et AOT utilisent le même compilateur avec un ensemble d'optimisations similaire, le code généré peut ne pas être identique. JIT utilise le type d'exécution permet une meilleure intégration et facilite le remplacement de la pile (OSR). compilation possible, qui génèrent toutes un code légèrement différent.

Architecture JIT

Architecture JIT
Figure 1 : Architecture JIT.

Compilation JIT

La compilation JIT implique les activités suivantes:

Démonstration guidée par le profil
Figure 2 : Compilation guidée par le profil.
  1. L'utilisateur exécute l'application, ce qui déclenche ensuite ART pour charger le .dex. .
    • Si le fichier .oat (le binaire AOT du .dex ) est disponible, ART l'utilise directement. Bien que les fichiers .oat soient générés régulièrement, ils ne contiennent pas toujours du code compilé (binaire AOT).
    • Si le fichier .oat ne contient pas de code compilé, ART s'exécute via JIT et l'interpréteur pour exécuter le fichier .dex.
  2. JIT est activé pour toute application qui n'est pas compilée selon les Filtre de compilation speed (qui indique "compilez autant que possible" depuis l'application").
  3. Les données de profil JIT sont vidées dans un fichier situé dans un répertoire système qui ne auquel l'application peut accéder.
  4. Le daemon de compilation AOT (dex2oat) analyse ce fichier pour piloter sa compilation.

    Daemon JIT
    Figure 3. Activités du daemon JIT.

Le service Google Play est un exemple utilisé par d'autres applications qui se comportent comme les bibliothèques partagées.

Workflow JIT

Architecture JIT
Figure 4 : Flux de données JIT.
  • Les informations de profilage sont stockées dans le cache de code et envoyées à la corbeille en cas de saturation de la mémoire.
    • Rien ne garantit qu'un instantané soit pris lorsque l'application se trouvait dans contient des données complètes (c'est-à-dire toutes les données qui ont fait l'objet d'un JITing).
    • Il n'y a aucune tentative de s'assurer que tout est enregistré (car cela peut avoir un impact performances d'exécution).
  • Les méthodes peuvent avoir trois états différents: <ph type="x-smartling-placeholder">
      </ph>
    • interprété (code DEX)
    • Compilation JIT
    • Compilation anticipée (ou "compilation AOT")
    S'il existe à la fois du code JIT et AOT (par exemple, en raison de désoptimisations répétées), le code JITed est à privilégier.
  • Mémoire requise pour exécuter JIT sans affecter l'application au premier plan dépendent de l'application en question. Les applications volumineuses nécessitent plus de mémoire que les petites applications. En général, la taille des applications volumineuses est d'environ 4 Mo.

Activer la journalisation JIT

Pour activer la journalisation JIT, exécutez les commandes suivantes:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

Désactiver le JIT

Pour désactiver le JIT, exécutez les commandes suivantes:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

Forcer la compilation

Pour forcer la compilation, exécutez la commande suivante:

adb shell cmd package compile

Cas d'utilisation courants de la compilation forcée d'un package spécifique:

  • Basée sur le profil:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • Complet:
    adb shell cmd package compile -m speed -f my-package
    

Cas d'utilisation courants de la compilation forcée de tous les packages:

  • Basée sur le profil:
    adb shell cmd package compile -m speed-profile -f -a
    
  • Complet:
    adb shell cmd package compile -m speed -f -a
    

Effacer les données du profil

Sur Android 13 ou version antérieure

Pour effacer les données de profil local et supprimer le code compilé, exécutez la commande suivante:

adb shell pm compile --reset 

Sur Android 14 ou version ultérieure

Pour effacer uniquement les données du profil local:

adb shell pm art clear-app-profiles 

Remarque: Contrairement à la commande d'Android 13, ou version antérieure, cette commande n'efface pas les données de profil externes (.dm) qui sont installé avec l'application.

Pour effacer les données de profil local et supprimer le code compilé généré à partir de données locales données de profil (pour rétablir l'état d'installation, par exemple), exécutez la commande suivante:

adb shell pm compile --reset 

Remarque: Cette commande ne supprime pas le code compilé généré à partir de données de profil externes (`.dm`) installées avec l'application.

Pour effacer tout le code compilé, exécutez cette commande:

adb shell cmd package compile -m verify -f 

Remarque: Cette commande conserve les données de profil locales.