Implementazione del compilatore just-in-time ART

Il runtime Android (ART) include un compilatore JIT (just-in-time) con profilazione del codice che migliorano continuamente le prestazioni delle app Android in esecuzione. Il compilatore JIT integra il compilatore corrente anticipata (AOT) di ART e migliora le prestazioni di runtime, fa risparmiare spazio di archiviazione e velocizza le applicazioni aggiornamenti di sistema. Migliora inoltre il compilatore AOT evitando rallentamento 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 set di ottimizzazioni simile, il codice generato potrebbe non essere identico. JIT utilizza il tipo di runtime informazioni, possono allinearsi meglio e implementare la sostituzione dello stack (OSR) la compilazione automatica, ognuno dei quali genera un codice leggermente diverso.

Architettura JIT

Architettura JIT
Figura 1. JIT.

Compilazione JIT

La compilazione JIT riguarda le seguenti attività:

Complementare guidato dal profilo
Figura 2. Compilazione guidata dal profilo.
  1. L'utente esegue l'app, quindi attiva ART per caricare .dex .
    • Se il file .oat (il programma binario AOT per .dex file) è disponibile, ART lo utilizza direttamente. Anche se i file .oat sono generati regolarmente, non sempre contengono codice compilato (binario AOT).
    • Se il file .oat non contiene codice compilato, ART esegue attraverso JIT e l'interprete per eseguire il file .dex.
  2. JIT è abilitato per qualsiasi applicazione non compilata secondo Filtro di compilazione speed (che dice "compila il più possibile direttamente dall'app").
  3. I dati del profilo JIT vengono scaricati in un file di una directory di sistema a cui può accedere l'applicazione.
  4. Il daemon di compilazione AOT (dex2oat) analizza questo file su Drive la sua compilazione.

    Daemon JIT
    Figura 3. attività del daemon JIT.

Google Play Services è un esempio utilizzato da altre applicazioni che si comportano in modo simile alle librerie condivise.

Flusso di lavoro JIT

Architettura JIT
Figura 4. Flusso di dati JIT.
  • Le informazioni di profilazione vengono archiviate nella cache del codice e sottoposte a garbage raccolta sotto la pressione della memoria.
    • Non vi è alcuna garanzia che venga acquisito uno snapshot quando l'applicazione si trovava contiene dati completi (ad esempio, tutto ciò che è stato JITed).
    • Non c'è alcun tentativo di assicurarsi che tutto venga registrato, poiché ciò può influire delle prestazioni di runtime).
  • I metodi possono avere tre stati diversi:
    • interpretato (codice dex)
    • Compilato da JIT
    • Compilazione AOT
    di Gemini Advanced. Se esistono sia codice JIT che AOT (ad es. a causa di ripetute disottimizzazioni), è preferibile usare il codice JIT.
  • Il requisito di memoria per eseguire JIT senza influire sull'app in primo piano il rendimento 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 vengono stabilizzate intorno ai 4 MB.

Attiva il logging JIT

Per attivare il logging JIT, esegui questi comandi:

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

Disabilita JIT

Per disabilitare JIT, esegui questi comandi:

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

Forza compilazione

Per forzare la compilazione, esegui questo comando:

adb shell cmd package compile

Casi d'uso comuni per la compilazione forzata 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 la compilazione forzata 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
    

Cancella i dati del profilo

Su Android 13 o versioni precedenti

Per cancellare i dati del profilo locale e rimuovere il codice compilato, esegui questo comando:

adb shell pm compile --reset 

Su Android 14 o versioni successive

Per cancellare solo i dati del profilo locale:

adb shell pm art clear-app-profiles 

Nota: a differenza del comando per Android 13 o una versione precedente, questo comando non cancella i dati del profilo esterno (".dm") che sono installato con l'app.

Per cancellare i dati del profilo locale e rimuovere il codice compilato generato dati del profilo (ovvero per reimpostare lo stato di installazione), esegui questo comando:

adb shell pm compile --reset 

Nota: questo comando non rimuove il codice compilato generato dati del profilo esterno (".dm") installati con l'app.

Per cancellare tutto il codice compilato, esegui questo comando:

adb shell cmd package compile -m verify -f 

Nota: questo comando conserva i dati del profilo locale.