AOT — qu'est-ce que la compilation Ahead-Of-Time et comment elle fonctionne

Auteur : IT Sectr Publié le : 2026-04-16 Temps de lecture : 9 min

AOT (Ahead-Of-Time) — une technologie de compilation où le code source ou le bytecode est converti en instructions machine avant l'exécution du programme, lors de la phase de construction ou d'installation. Sous Android, la compilation AOT est devenue une innovation clé de l'environnement d'exécution ART, qui a remplacé Dalvik dans la version 5.0 Lollipop. Selon Google, 2024, la compilation AOT dans ART élimine les délais de préchauffage et réduit la consommation énergétique des applications de 10–15% par rapport à l'approche JIT.

Points clés

  • AOT — compilation Ahead-Of-Time : conversion du code en code machine avant l'exécution du programme.
  • Sous Android, AOT est effectué par l'utilitaire dex2oat lors de l'installation de l'APK ou en arrière-plan.
  • Le principal avantage d'AOT est le démarrage instantané des applications sans phase de préchauffage.
  • L'inconvénient est un temps d'installation accru et un espace disque supplémentaire de 15–30%.
  • Les systèmes modernes utilisent une approche hybride : JIT pour les premiers lancements, AOT pour les méthodes hot.

Qu'est-ce que la compilation AOT ?

Ahead-Of-Time (AOT) est une méthode de compilation où un programme est converti en code machine avant son exécution. Le terme « Ahead-Of-Time » contraste avec JIT (Just-In-Time) : si JIT compile « juste à temps », alors AOT compile « en avance ». Un compilateur AOT prend le code source ou une représentation intermédiaire (bytecode) en entrée et génère un fichier exécutable prêt à l'emploi.

L'histoire d'AOT remonte aux compilateurs traditionnels de C et C++, où la compilation a toujours lieu avant l'exécution. Dans le contexte des langages gérés (Java, C#, Dart), AOT est une innovation plus récente : pendant longtemps, on croyait que les capacités dynamiques (réflexion, chargement dynamique de classes) rendaient AOT difficile à implémenter. Google a résolu ce problème pour Android en créant dex2oat — un compilateur AOT de bytecode DEX en code natif.

Comment fonctionne AOT

Un compilateur AOT effectue un cycle de traduction complet. La première étape est l'analyse syntaxique et la construction d'un arbre syntaxique abstrait (AST). La deuxième est l'analyse et l'optimisation : élimination de code mort, inlining, optimisation de boucles. La troisième est la génération de code machine pour l'architecture cible (ARM, ARM64, x86). Le résultat est un fichier exécutable qui ne nécessite aucun traitement supplémentaire au moment de l'exécution.

bash
# Exécution manuelle du compilateur AOT dex2oat
dex2oat --dex-file=classes.dex \
        --oat-file=classes.oat \
        --arch=arm64 \
        --instruction-set-variant=generic

# Vérifier le fichier OAT compilé
oatdump --oat-file=classes.oat --output=oat_dump.txt

AOT sous Android : dex2oat et fichiers OAT

Sous Android, la compilation AOT est implémentée via l'utilitaire dex2oat (dalvik executable to optimized android translator). Lorsqu'un utilisateur installe une application, le système exécute dex2oat, qui lit les fichiers DEX de l'APK, optimise le bytecode et crée un fichier OAT — un binaire ELF avec du code natif. Ce fichier est enregistré dans la partition /data/dalvik-cache/.

Le processus de compilation comprend plusieurs niveaux d'optimisation. Le niveau de base — vérification de bytecode et optimisations de base (suppression de code mort, constant folding). Le niveau intermédiaire — inlining de méthodes, déroulage de boucles, analyse d'échappement. Le niveau maximum — optimisations globales de l'ensemble de l'application, y compris la dévirtualisation et l'optimisation de la taille de la pile. Le niveau d'optimisation dépend du mode de compilation (speed, speed-profile, space).

Structure du fichier OAT

Un fichier OAT utilise le format ELF (Executable and Linkable Format) — le même format que celui utilisé par les binaires natifs Linux. À l'intérieur du fichier OAT se trouve le code compilé pour chaque méthode de l'application, ainsi que des métadonnées : informations sur les classes, les champs, les méthodes et leurs relations. ART utilise ces métadonnées pour un chargement rapide des classes et la résolution de références symboliques sans analyse complète du DEX.

Composant OATObjectif
En-tête ELFEn-tête du format ELF
Section de codeCode machine des méthodes compilées
En-tête OATMétadonnées ART : version, tailles de section
Sections DEXDonnées DEX originales pour la réflexion
Table de liaisonTable de liaison pour JNI et les bibliothèques natives

AOT vs JIT : analyse comparative

AOT et JIT représentent différents points dans l'espace de compromis entre performance et flexibilité. AOT offre une vitesse d'exécution maximale dès la première seconde, mais nécessite plus d'espace disque et de temps d'installation. JIT économise de l'espace et du temps d'installation, mais paie avec des délais de préchauffage et des pics de consommation énergétique.

Le facteur de sélection clé est le cas d'utilisation. Pour les applications qui sont lancées une fois et fonctionnent longtemps (jeux, éditeurs, navigation), AOT est préférable — les coûts de compilation sont compensés par des performances stables. Pour les petits utilitaires rarement lancés et fonctionnant pendant de courtes périodes, JIT peut être plus avantageux — une installation rapide et une faible empreinte sont plus importantes que les performances de pointe.

CritèreAOTJIT
DémarrageInstantanéAvec préchauffage
InstallationPlus lente (compilation)Rapide
Espace disque+15–30%Minimal
Consommation énergétiqueStablePics pendant la compilation
AdaptabilitéFaibleÉlevée

Performance du code

Une nuance intéressante : le code AOT n'est pas toujours plus rapide que JIT. JIT a accès aux informations de profilage en temps d'exécution — types d'objets précis, fréquences d'appel, modèles de branchement réels. Cela permet d'appliquer des optimisations indisponibles pour AOT (par exemple, l'inlining guidé par profil). En pratique, la différence de performance du code compilé entre AOT et JIT est de ±5–10% selon le scénario.

Avantages de la compilation AOT

AOT offre trois avantages clés pour les applications mobiles. Premièrement — des performances prévisibles. L'utilisateur ne voit pas de « bégaiements » dans les premières secondes : l'application fonctionne à vitesse maximale dès la première image. C'est essentiel pour les jeux, les animations et les interfaces avec des transitions fluides.

Deuxièmement — l'efficacité énergétique. AOT ne crée pas de pics de charge CPU typiques de la compilation JIT. Le processeur fonctionne en mode stable, réduisant la consommation énergétique de 10–15% pendant les 30–60 premières secondes d'utilisation de l'application. Pour un utilisateur typique lançant 20–30 applications par jour, cela offre une augmentation notable de l'autonomie de la batterie.

Simplification de l'environnement d'exécution

La compilation AOT simplifie l'environnement d'exécution. Lorsque tout le code est déjà compilé, il n'y a pas besoin de compilateur JIT, d'interpréteur ou de profileur au moment de l'exécution. Cela réduit la taille de l'environnement d'exécution lui-même et diminue la probabilité d'erreurs. ART en mode AOT complet utilise environ 15% de RAM en moins qu'un environnement similaire avec JIT actif.

Inconvénients de la compilation AOT

Le principal inconvénient d'AOT est le temps d'installation. Sur les premiers appareils avec Android 5.0, l'installation de grandes applications (100–200 Mo) pouvait prendre 2–5 minutes en raison de la compilation AOT. Cela créait une expérience utilisateur négative : après le téléchargement de l'APK, les utilisateurs devaient attendre avant d'ouvrir l'application. Google a partiellement résolu ce problème dans Android 7.0 en passant à un schéma hybride.

Le deuxième inconvénient est l'espace disque. Les fichiers OAT sont 15–30% plus volumineux que les fichiers DEX d'origine. Sur les appareils avec 8–16 Go de stockage interne, chaque application « mange » de l'espace supplémentaire sur la partition système. Pour les utilisateurs avec un grand nombre d'applications installées (50–100), cela peut entraîner un manque d'espace pour les mises à jour système.

Manque d'adaptabilité

Le code AOT est figé au moment de la compilation. Si l'application utilise différents modèles d'exécution selon la version d'Android, le modèle d'appareil ou les paramètres utilisateur, AOT ne peut pas s'adapter. Les optimisations choisies pour un scénario peuvent être sous-optimales pour un autre. JIT est plus flexible à cet égard : il recompile les méthodes hot lorsque les conditions d'exécution changent.

AOT au-delà d'Android : Flutter, .NET, Go

La compilation AOT n'est pas seulement utilisée sous Android. Flutter utilise AOT pour compiler le code Dart en code natif pour iOS et Android. Cela garantit des performances UI à 60 fps même sur les appareils d'entrée de gamme. Pendant le développement, Flutter utilise JIT (hot reload), et pour les versions de production — AOT, combinant les avantages des deux approches.

Dans l'écosystème .NET, la technologie ReadyToRun (R2R) permet de compiler les assemblys en code natif à l'avance. Cela réduit le temps de démarrage des applications .NET de 30–50%. Le compilateur Go est intrinsèquement un compilateur AOT : les programmes Go sont compilés en un seul binaire statique sans dépendances externes, ce qui les rend idéaux pour les environnements conteneurisés.

dart
// Flutter : compilation AOT de Dart en code natif
// La version de production utilise AOT
flutter build apk --release

// Résultat : libapp.so avec code Dart compilé en AOT
// Le développement utilise JIT (hot reload)
flutter run

AOT et sécurité

Un avantage supplémentaire d'AOT est de rendre la rétro-ingénierie plus difficile. Le code natif compilé est plus difficile à décompiler que le bytecode. Des outils comme JADX et APKTool fonctionnent avec le format DEX mais ne peuvent pas reconstituer le code source à partir des fichiers OAT avec le même niveau de détail. Cela ne remplace pas l'obfuscation (ProGuard, R8), mais crée une barrière supplémentaire pour les analyseurs.

Stratégie hybride : compilation profilée

La norme moderne sous Android est la compilation AOT profilée, implémentée dans ART à partir d'Android 7.0. Lors de l'installation, l'application n'est pas entièrement compilée — à la place, une vérification rapide du bytecode et JIT sont utilisés pour les premiers lancements. Cela résout le problème de longue installation caractéristique de l'AOT pur dans Android 5.0–6.0.

Après 2–3 lancements de l'application, le profileur ART collecte des données sur l'utilisation réelle et détermine quelles méthodes sont les plus critiques pour les performances. Ensuite, en arrière-plan (généralement la nuit lorsque l'appareil est en charge), dex2oat compile ces méthodes hot en code natif. Après la compilation en arrière-plan, l'application atteint des performances équivalentes à l'AOT complet, sans impact négatif sur l'expérience utilisateur lors de l'installation.

kotlin
// Contrôle programmatique du mode de compilation (Android 9+)
fun requestProfileCompilation(context: Context) {
    val pm = context.packageManager
    // Il est recommandé d'utiliser la compilation profilée
    pm.setComponentEnabledSetting(
        ComponentName(context, javaClass()),
        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
        PackageManager.DONT_KILL_APP
    )
}

Optimisation pour le mode hybride

Pour maximiser les avantages de la compilation hybride, les développeurs doivent suivre quelques règles. Utilisez des profils de base (baseline profiles) — des profils pré-collectés qui sont fournis avec l'APK et permettent à ART de commencer la compilation AOT des méthodes hot immédiatement après l'installation. Les profils de base réduisent le temps pour atteindre les performances complètes de 2–3 lancements au premier lancement.

Questions fréquentes

Qu'est-ce que la compilation AOT en termes simples ?

AOT consiste à convertir un programme en code machine à l'avance, avant que l'utilisateur ne l'exécute. Imaginez qu'un livre soit entièrement traduit dans votre langue avant de l'ouvrir — vous lisez immédiatement, sans délai de traduction des pages.

En quoi AOT diffère-t-il de JIT ?

AOT compile le code lors de l'installation (installation plus lente, mais démarrage plus rapide). JIT compile le code au moment de l'exécution (installation rapide, mais les premières secondes sont plus lentes). Les systèmes modernes combinent les deux approches.

Pourquoi Android est-il passé de Dalvik à ART avec AOT ?

Google souhaitait éliminer le problème de préchauffage JIT — les ralentissements dans les premières secondes d'exécution de l'application. La compilation AOT dans ART a permis un démarrage instantané et une réduction de la consommation énergétique, ce qui était crucial pour les appareils mobiles.

Comment AOT affecte-t-il la taille de l'application ?

La taille de l'APK ne change pas — la compilation AOT crée des fichiers OAT sur la partition système qui sont 15–30% plus volumineux que les fichiers DEX d'origine. L'utilisateur perçoit cela comme une réduction de l'espace de stockage interne disponible, et non comme une augmentation de la taille du fichier téléchargé.

Qu'est-ce que l'AOT profilé ?

C'est une approche hybride où les premiers lancements de l'application utilisent JIT, puis le système compile en arrière-plan uniquement les méthodes fréquemment utilisées en code natif. Cela combine l'installation rapide de JIT avec les hautes performances d'AOT.

Résumé

  • AOT (Ahead-Of-Time) — compilation du bytecode en code machine avant l'exécution du programme, lors de la phase d'installation.
  • Sous Android, AOT est implémenté via l'utilitaire dex2oat, créant des binaires ELF (fichiers OAT).
  • Principaux avantages d'AOT : démarrage instantané, performances stables et faible consommation énergétique.
  • Principaux inconvénients : temps d'installation accru et espace disque supplémentaire de 15–30%.
  • AOT est utilisé non seulement sous Android, mais aussi dans Flutter (Dart), .NET (R2R) et Go.
  • L'ART moderne utilise l'AOT profilé : JIT pour les premiers lancements, compilation en arrière-plan des méthodes hot.
  • Les profils de base permettent de commencer la compilation AOT des méthodes clés immédiatement après l'installation de l'application.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi