Profili immagine di avvio

Android 11 o versioni successive supportano la generazione di profili immagine di avvio, che incapsulano informazioni sul codice di vari componenti a livello di sistema come server di sistema e percorso di classe di avvio. Android Runtime (ART) utilizza queste informazioni per eseguire ottimizzazioni a livello di sistema, alcune delle quali sono fondamentali per le prestazioni di Android e influiscono sull'esecuzione di tutto il codice non nativo (a livello di sistema o di app). In alcuni casi, i profili delle immagini di avvio possono influire sulle prestazioni di esecuzione e sul consumo di memoria con percentuali a due cifre.

Ottieni informazioni sul profilo di avvio

I profili delle immagini di avvio derivano dai profili delle app eseguite durante i percorsi utente critici (CUJ). In una configurazione specifica del dispositivo, ART acquisisce (come parte dei profili JIT) i metodi e le classi del percorso di classe di avvio utilizzati dalle app, quindi registra tali informazioni nel profilo dell'app (ad esempio, /data/misc/profiles/cur/0/com.android.chrome/primary.prof ), dove è indicizzato dal file Dalvik EXecutable (DEX) del percorso di classe di avvio (vedere Formato profilo ART ).

Esamina i profili dell'app registrati durante i CUJ per determinare quale parte del classpath di avvio è più utilizzata e più importante da ottimizzare (per un esempio, vedi Formato del profilo ART ). L'inclusione di tutti i metodi o le classi influisce negativamente sulle prestazioni, quindi concentrati sui percorsi di codice più comunemente utilizzati. Ad esempio, se un metodo del classpath di avvio viene utilizzato da una singola app, non deve far parte dei profili di avvio. Ciascun dispositivo deve configurare la selezione del metodo/della classe in base alla selezione del CUJ e alla quantità di dati prodotti dal test.

Per aggregare le informazioni sul percorso di classe di avvio da tutti i profili delle singole app sul dispositivo, esegui il comando adb shell cmd package snapshot-profile android . È possibile utilizzare le informazioni aggregate come base per l'elaborazione e la selezione di metodi/classi senza aggregare manualmente i singoli profili (anche se è possibile farlo se lo si desidera).

Profilo immagine di avvio

Figura 1. Processo per ottenere i profili delle immagini di avvio

Dati del profilo dell'immagine di avvio

I profili immagine di avvio includono i seguenti file e dati.

  • Profilo per il classpath di avvio ( frameworks/base/config/boot-image-profile.txt ). Determina quali metodi del classpath di avvio vengono ottimizzati, quale classe è inclusa nell'immagine .art di avvio e come sono disposti i file DEX corrispondenti.

  • Elenco delle classi precaricate . Determina quali classi sono precaricate in Zygote.

  • Profilo per i componenti del server di sistema ( frameworks/base/services/art-profile ). Determina quali metodi del server di sistema vengono ottimizzati/compilati, quale classe è inclusa nell'immagine .art di avvio e come sono disposti i file DEX corrispondenti.

Formato del profilo ART

Il profilo ART cattura informazioni da ciascuno dei file DEX caricati, comprese informazioni sui metodi che vale la pena ottimizzare e sulle classi utilizzate durante l'avvio. Quando la profilazione dell'immagine di avvio è abilitata, ART include anche il classpath di avvio e i file JAR del server di sistema nel profilo e annota ciascun file DEX con il nome del pacchetto che lo utilizza.

Ad esempio, scarica il profilo dell'immagine di avvio raw con il seguente comando:

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

Questo produce un output simile a:

=== 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: …

Nell'esempio sopra:

  • core-oj.jar è utilizzato da com.google.android.ext.services e com.android.systemui . Ogni voce elenca i due pacchetti utilizzati da core-oj.jar .

  • Entrambi i processi utilizzano il metodo con indice DEX 520, ma solo il processo systemui utilizza il metodo con indice DEX 521. La stessa logica si applica alle altre sezioni del profilo (ad esempio, le classi di avvio).

Durante l'elaborazione dei dati, filtrare metodi/classi in base all'utilizzo, dando priorità ai processi a livello di sistema (ad esempio, system server o systemui ) o a metodi che potrebbero non essere comunemente utilizzati ma che sono comunque importanti (ad esempio, metodi utilizzati dal applicazione della fotocamera).

Il formato del profilo annota internamente ciascun metodo con più flag (avvio, post-avvio, hotness, abi), che sono più di quelli visualizzati nel formato di solo dump. Per utilizzare tutti i segnali, modificare gli script disponibili.

Raccomandazioni

Utilizzare le seguenti linee guida per ottenere i migliori risultati.

  • Distribuisci la configurazione per generare profili immagine di avvio su diversi dispositivi di test e aggrega i risultati prima di generare il profilo immagine di avvio finale. Lo strumento profman supporta l'aggregazione e la selezione di più profili di immagine di avvio, ma funziona solo con la stessa versione dell'immagine di avvio (stesso percorso di classe di avvio).

  • Assegnare la priorità di selezione ai metodi/classi utilizzati dai processi di sistema. Questi metodi/classi potrebbero utilizzare codice che non viene utilizzato spesso da altre app ma che è comunque fondamentale da ottimizzare.

  • La forma dei dati derivanti dall'esecuzione di un singolo dispositivo appare molto diversa rispetto ai dispositivi di test che eseguono CUJ nel mondo reale. Se non disponi di un ampio parco di dispositivi di test, utilizza lo stesso dispositivo per eseguire diversi CUJ per aumentare la certezza che le ottimizzazioni del profilo dell'immagine di avvio funzioneranno bene in produzione (questo scenario è descritto di seguito).

Configura i dispositivi

Per abilitare la configurazione del profilo di avvio tramite le proprietà del sistema, utilizzare uno dei seguenti metodi.

  • Opzione 1: imposta manualmente gli oggetti di scena (funziona fino al riavvio):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
    
  • Opzione 2: utilizzare un local.prop (effetto permanente fino all'eliminazione del file). Fare così:

    1. Crea un file local.prop con il contenuto:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Esegui i seguenti comandi:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
      
  • Opzione 3: utilizzare la configurazione del dispositivo per impostare le seguenti proprietà lato server:

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

Genera profili di immagini di avvio

Utilizzare le seguenti istruzioni per generare un profilo immagine di avvio di base utilizzando il test su un singolo dispositivo.

  1. Configura il dispositivo.

    1. Configurare il dispositivo come descritto in Configurazione dei dispositivi .

    2. (Facoltativo) È necessario del tempo affinché il nuovo formato del profilo pulisca e sostituisca gli altri profili. Per velocizzare la raccolta dei profili, reimpostare tutti i profili sul dispositivo.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
      
    3. Eseguire i CUJ sul dispositivo.

  2. Cattura il profilo utilizzando il seguente comando:

    adb shell cmd package snapshot-profile android
    
  3. Estrai il profilo utilizzando il seguente comando:

    adb pull /data/misc/profman/android.prof
    
  4. Passare ai file JAR del percorso di classe di avvio utilizzando i seguenti comandi:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
    
  5. Genera il profilo dell'immagine di avvio utilizzando il seguente comando profman .

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
    
  6. Utilizzando i dati, modificare il comando profman utilizzando i flag di soglia di selezione disponibili.

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

    Per visualizzare l'elenco completo, fare riferimento alla pagina di aiuto profman o al codice sorgente.