Android 11 o versioni successive supportano la generazione di profili di immagini di avvio, che contengono informazioni sul codice di vari componenti a livello di sistema, come il server di sistema e il classpath 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.
Ottenere 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 classpath 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 sono
indicizzate dal file DEX (Dalvik EXecutable) del classpath di avvio (vedi Formato del profilo
ART).
Esamina i profili delle 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ù utilizzati. Ad esempio, se un metodo del boot classpath viene utilizzato da una sola app, non deve far parte dei profili di avvio. Ogni dispositivo deve configurare la selezione di metodi/classi in base alla selezione di CUJ e alla quantità di dati prodotta dai test.
Per aggregare le informazioni sul classpath di avvio di tutti i singoli profili 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 vuoi).
Figura 1. Procedura per ottenere i profili delle immagini di avvio
Dati del profilo dell'immagine di avvio
I profili delle immagini 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 e quale classe è inclusa nell'immagine.art
di avvio.Elenco delle 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 sono disposti i file DEX corrispondenti.
Formato del profilo ART
Il profilo ART acquisisce informazioni da ciascuno dei file DEX caricati, incluse 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 i file JAR del classpath di avvio e del server di sistema nel profilo e annota ogni file DEX con il nome del pacchetto che lo utilizza.
Ad esempio, scarica il profilo dell'immagine di avvio non elaborata con il comando seguente:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof
Questo produce un 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 dacom.google.android.ext.services
ecom.android.systemui
. Ogni voce elenca i due pacchetti utilizzati dacore-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 ragionamento si applica alle 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à
ai processi a livello di sistema (ad esempio, il server di sistema o systemui
) o ai
metodi che potrebbero non essere utilizzati comunemente, ma sono comunque importanti (ad esempio,
i metodi utilizzati dall'app Fotocamera).
Il formato del profilo annota internamente ogni metodo con più flag (avvio, post-avvio, hotness, ABI), che sono più di quelli visualizzati nel formato solo dump. Per utilizzare tutti i segnali, modifica gli script disponibili.
Consigli
Per ottenere risultati ottimali, segui le linee guida riportate di seguito.
Esegui il deployment della configurazione per la generazione dei profili delle 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 di immagini di avvio, ma funziona solo con la stessa versione dell'immagine di avvio (stesso classpath 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 spesso utilizzato da altre app, ma che è comunque fondamentale per l'ottimizzazione.
La forma dei dati di una singola esecuzione del dispositivo è molto diversa rispetto ai dispositivi di test che eseguono CUJ reali. Se non disponi di un parco risorse di test di grandi dimensioni, utilizza lo stesso dispositivo per eseguire diverse CUJ per aumentare la certezza che le ottimizzazioni del profilo dell'immagine di avvio funzioneranno 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 le proprietà (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:Crea un file
local.prop
con il seguente contenuto:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
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:
adb shell device_config put runtime_native_boot profilebootclasspath true adb shell device_config put runtime_native_boot profilesystemserver true
Generare profili di immagini di avvio
Segui le istruzioni riportate di seguito per generare un profilo di immagine di avvio di base utilizzando i test su un singolo dispositivo.
Configura il dispositivo.
Configura il dispositivo come descritto in Configurazione dei dispositivi.
(Facoltativo) È necessario del tempo prima che il nuovo formato del profilo pulisca e sostituisca 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
Esegui i test CUJ sul dispositivo.
Acquisisci il profilo utilizzando il seguente comando:
adb shell cmd package snapshot-profile android
Estrai il profilo utilizzando il seguente comando:
adb pull /data/misc/profman/android.prof
Vai ai file JAR del classpath di avvio utilizzando i seguenti comandi:
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
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=...
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 il codice sorgente.