Profili immagine di avvio

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

Ottieni informazioni del profilo di avvio

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

Esamina i profili dell'app registrati durante i CUJ per determinare quale parte del percorso di caricamento è più utilizzata e più importante da ottimizzare (per un esempio, consulta il formato del profilo ART). L'inclusione di tutti i metodi o delle classi influisce negativamente sulle prestazioni, per cui 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. Ogni 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 di tutti i singoli profili dell'app sul dispositivo, esegui il comando adb shell cmd package snapshot-profile android. Puoi utilizzare le informazioni aggregate come base per l'elaborazione e la selezione di metodi/classi senza aggregare manualmente i singoli profili (anche se puoi farlo se lo desideri).

Profilo dell'immagine di avvio

Figura 1. Processo per il recupero dei profili delle immagini di avvio

Dati profilo immagine di avvio

I profili dell'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 di avvio .art e come vengono disposti i file DEX corrispondenti.

  • Elenco di 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 vengono disposti i file DEX corrispondenti.

Formato profilo ART

Il profilo ART acquisisce informazioni da ciascuno dei file DEX caricati, incluse informazioni sui metodi da ottimizzare e sulle classi utilizzate durante l'avvio. Quando il profiling dell'immagine di avvio è abilitato, ART include nel profilo anche il percorso di classe di avvio e i file JAR del server di sistema e annota ogni file DEX con il nome del pacchetto che lo utilizza.

Ad esempio, esegui il dump del profilo dell'immagine di avvio non elaborata con il seguente comando:

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

L'output è simile al seguente:

=== 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 riportato 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. Lo stesso vale per le altre sezioni del profilo (ad esempio i corsi di avvio).

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

Il formato del profilo annota internamente ogni metodo con più flag (startup, post-startup, hotness, abi), più di quanto visualizzato nel formato solo dump. Per utilizzare tutti gli indicatori, modifica gli script disponibili.

Consigli

Attieniti alle linee guida che seguono per ottenere risultati ottimali.

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

  • Assegna la priorità alla selezione ai metodi/alle classi utilizzati dai processi di sistema. Questi metodi/classi potrebbero utilizzare codice che non viene utilizzato spesso da altre app, ma che è comunque fondamentale per l'ottimizzazione.

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

Configura dispositivi

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

  • Opzione 1: configura manualmente gli oggetti (funziona per il 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: utilizza un local.prop (effetto permanente fino all'eliminazione del file). Per farlo:

    1. Crea un file local.prop con i seguenti contenuti:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Esegui questi comandi:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
      
  • Opzione 3: utilizza 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

Segui le istruzioni riportate di seguito per generare un profilo di immagine di avvio di base utilizzando il test su un singolo dispositivo.

  1. Configura il dispositivo.

    1. Configura il dispositivo come descritto in Configurare i dispositivi.

    2. (Facoltativo) La pulizia e la sostituzione degli altri profili nel nuovo formato del profilo potrebbero richiedere del tempo. Per velocizzare la raccolta dei profili, reimposta tutti i profili sul dispositivo.

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

  2. Acquisisci il profilo utilizzando il comando seguente:

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

    adb pull /data/misc/profman/android.prof
    
  4. Vai ai file JAR del classpath 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, modifica 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, consulta la pagina di assistenza profman o consulta il codice sorgente.