Il runtime di Android (ART) include un compilatore JIT (just-in-time) con profilatura del codice che migliora continuamente le prestazioni delle applicazioni Android durante l'esecuzione. Il compilatore JIT integra l'attuale compilatore AOT (Anteprima del tempo) di ART e migliora le prestazioni di runtime, risparmia spazio di archiviazione e velocizza gli aggiornamenti delle applicazioni e del sistema. Migliora anche il compilatore AOT evitando il rallentamento del sistema durante gli aggiornamenti automatici delle applicazioni o la ricompilazione delle applicazioni durante gli aggiornamenti over-the-air (OTA).
Sebbene JIT e AOT utilizzino lo stesso compilatore con un insieme simile di ottimizzazioni, il codice generato potrebbe non essere identico. JIT utilizza le informazioni sul tipo di runtime, può fare un migliore inlining e rende possibile la compilazione della sostituzione dello stack (OSR), il tutto genera codice leggermente diverso.
Architettura JIT

Compilazione JIT
La compilazione della JIT prevede le seguenti attività:

- L'utente esegue l'app, che quindi attiva ART per caricare il file
.dex
.- Se il file
.oat
(il binario AOT per il file.dex
) è disponibile, ART lo utilizza direttamente. Sebbene i file.oat
vengano generati regolarmente, non sempre contengono codice compilato (binario AOT). - Se il file
.oat
non contiene codice compilato, ART esegue JIT e l'interprete per eseguire il file.dex
.
- Se il file
- JIT è abilitato per qualsiasi applicazione che non è compilata in base al filtro di compilazione della
speed
(che dice "compila il più possibile dall'app"). - I dati del profilo JIT vengono scaricati in un file in una directory di sistema a cui solo l'applicazione può accedere.
- Il demone della compilazione AOT (
dex2oat
) analizza quel file per guidarne la compilazione.Figura 3. Attività del demone JIT.
Il servizio Google Play è un esempio utilizzato da altre applicazioni che si comportano in modo simile alle librerie condivise.
Flusso di lavoro JIT

- Le informazioni di profilatura vengono archiviate nella cache del codice e soggette a Garbage Collection sotto pressione di memoria.
- Non vi è alcuna garanzia che un'istantanea scattata quando l'applicazione era in background conterrà dati completi (ovvero, tutto ciò che è stato sottoposto a JIT).
- Non c'è alcun tentativo di garantire che tutto sia registrato (poiché ciò può influire sulle prestazioni di runtime).
- I metodi possono trovarsi in tre stati diversi:
- interpretato (codice dex)
- JIT compilato
- AOT compilato
- Il requisito di memoria per eseguire JIT senza influire sulle prestazioni dell'app in primo piano dipende dall'app in questione. Le app di grandi dimensioni richiedono più memoria rispetto alle app di piccole dimensioni. In generale, le app di grandi dimensioni si stabilizzano intorno ai 4 MB.
Attivazione della registrazione JIT
Per attivare la registrazione JIT, eseguire i seguenti comandi:
adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start
Disabilitazione JIT
Per disabilitare JIT, eseguire i seguenti comandi:
adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start
Compilazione forzata
Per forzare la compilazione, eseguire quanto segue:
adb shell cmd package compile
Casi d'uso comuni per forzare la compilazione di un pacchetto specifico:
- Basato sul profilo:
adb shell cmd package compile -m speed-profile -f my-package
- Completo:
adb shell cmd package compile -m speed -f my-package
Casi d'uso comuni per forzare la compilazione di tutti i pacchetti:
- Basato sul profilo:
adb shell cmd package compile -m speed-profile -f -a
- Completo:
adb shell cmd package compile -m speed -f -a
Cancellazione dei dati del profilo
Per cancellare i dati del profilo e rimuovere il codice compilato, eseguire quanto segue:
- Per un pacchetto:
adb shell cmd package compile --reset my-package
- Per tutti i pacchetti:
adb shell cmd package compile --reset -a