Profili immagine di avvio

Android 11 o versioni successive supporta la generazione di profili dell'immagine di avvio, che incapsulano informazioni sul codice di vari componenti a livello di sistema, come il sistema server e il percorso di classe 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.

Ottenere informazioni sul 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 le classi influisce negativamente sul rendimento, quindi concentrati sui percorsi di codice più 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 immagine di avvio

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

Dati del profilo dell'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 vengono 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 di avvio .art e come vengono disposti i file DEX corrispondente.

Formato del 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 i metodi/le classi in base all'utilizzo, dando la priorità alle procedure a livello di sistema (ad esempio il server di sistema o systemui) o ai metodi che potrebbero non essere di uso comune, 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

Per ottenere risultati ottimali, segui le linee guida riportate di seguito.

  • 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à di 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 di un singolo test del dispositivo è molto diversa rispetto ai dispositivi di test che eseguono CUJ reali. Se non hai un parco di dispositivi di test di grandi dimensioni, utilizza lo stesso dispositivo per eseguire diversi CUJ per aumentare la certezza che le ottimizzazioni del profilo dell'immagine di avvio funzionino bene in produzione (questo scenario è descritto di seguito).

Configurare i dispositivi

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

  • Opzione 1: configura manualmente gli elementi 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: 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 i seguenti 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) Il nuovo formato del profilo richiede tempo per ripulire e sostituire gli altri profili. 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 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. 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 o il codice sorgente di profman.