I profili di base migliorano la velocità di esecuzione del codice di circa il 30% dal primo avvio evitando i passaggi di interpretazione e compilazione just-in-time (JIT) per i percorsi del codice inclusi.
Se includi un profilo di baseline in un'app o in una libreria, Android Runtime (ART) può ottimizzare i percorsi di codice specificati tramite la compilazione Ahead-of-Time (AOT), migliorando le prestazioni per ogni nuovo utente e ogni aggiornamento dell'app. Questa Profile Guided Optimization (PGO) consente alle app di ottimizzare l'avvio, ridurre i problemi di interazione e migliorare le prestazioni complessive di runtime per gli utenti fin dal primo avvio.
Questi miglioramenti delle prestazioni si traducono direttamente in un miglioramento delle metriche aziendali, come fidelizzazione utenti, transazioni e valutazioni. Puoi scoprire di più su come il rendimento influisce sulle metriche aziendali nelle storie di Josh, Lyft, TikTok e Zomato.
Vantaggi dei profili di base
I profili di base consentono la precompilazione del codice nelle interazioni utente critiche, come l'avvio dell'app, la navigazione tra le schermate o lo scorrimento dei contenuti, rendendole più fluide fin dalla prima esecuzione. Aumentando la velocità e la reattività di un'app, i profili di base possono portare a un maggior numero di utenti attivi giornalieri e a un tasso di visite di ritorno medio più elevato.
I profili di baseline aiutano a guidare l'ottimizzazione oltre l'avvio dell'app fornendo interazioni comuni degli utenti che migliorano l'esecuzione dell'app dal primo avvio. La compilazione AOT guidata non si basa sui dispositivi degli utenti e può essere eseguita una volta per release su una macchina di sviluppo anziché su un dispositivo mobile. Con la pubblicazione di release con un profilo di baseline, le ottimizzazioni delle app diventano disponibili molto più rapidamente rispetto a quanto avviene con i soli profili cloud.
Quando non viene utilizzato un profilo di baseline, tutto il codice dell'app viene compilato JIT in memoria
dopo essere stato interpretato o scritto in un file odex in background quando il
dispositivo è inattivo. Dopo aver installato o aggiornato un'app, gli utenti hanno un'esperienza non ottimale dalla prima esecuzione fino all'ottimizzazione dei nuovi percorsi di codice.
Molte app misurano un aumento delle prestazioni di circa il 30% dopo l'ottimizzazione.
Profili di avvio
I profili di avvio sono simili ai profili di baseline, ma vengono utilizzati in fase di compilazione per ottimizzare il layout DEX per tempi di avvio più rapidi, anziché per l'ottimizzazione sul dispositivo. Per scoprire di più sulle differenze tra i profili di avvio e i profili di baseline, consulta Confrontare i profili di baseline e i profili di avvio. Per saperne di più sull'ottimizzazione del layout DEX, consulta Ottimizzazioni del layout DEX e profili di avvio.
Inizia
Per iniziare a ottimizzare le prestazioni nella tua app esistente, consulta Creare profili di baseline.
Generazione di profili e build di release
È importante comprendere la differenza tra le configurazioni della build richieste
quando generi i file di profilo di baseline e di avvio (ad esempio,
baseline-prof.txt e startup-prof.txt) e quando crei l'APK della release finale
che utilizza questi profili.
Quando generi file di profilo (ad esempio, benchmark):
Per assicurarti che le regole del profilo generate corrispondano accuratamente alle firme dei metodi del codice, devi disattivare l'offuscamento e l'ottimizzazione (R8) per la variante di build utilizzata per la generazione del profilo. Questa variante di compilazione deve essere diversa dalla variante di compilazione di release, che ha l'offuscamento e l'ottimizzazione attivi. Per farlo, imposta isMinifyEnabled = false per la variante di compilazione
di generazione del profilo. Se non utilizzi il plug-in Gradle per i profili di baseline, devi anche assicurarti che siano applicati -dontobfuscate e -dontoptimize. Il
plug-in Gradle per i profili di baseline
gestisce automaticamente questa configurazione.
Quando crei l'APK della release finale:
La build di release deve sempre avere isMinifyEnabled = true per usufruire di
offuscamento, minimizzazione e ottimizzazione. R8 riscrive automaticamente le regole
dai file di profilo non offuscati in modo che corrispondano al codice offuscato e ottimizzato
nell'APK di release. Affinché l'ottimizzazione del layout DEX (basata sui profili di avvio) sia efficace, l'app di rilascio deve essere offuscata e utilizzare R8 con tutte le ottimizzazioni abilitate.
Versioni stabili minime consigliate
La catena di dipendenze fornisce versioni di rilascio stabili e di sviluppo. Per generare e installare un profilo di baseline, utilizza le seguenti versioni supportate o successive del plug-in Android per Gradle, della libreria Macrobenchmark e di Profile Installer. Queste dipendenze sono necessarie in momenti diversi e funzionano insieme come una toolchain per consentire un profilo di baseline ottimale.
- Plug-in Android per Gradle:
com.android.tools.build:8.0.0 - Libreria Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.4.1 - Programma di installazione del profilo:
androidx.profileinstaller:profileinstaller:1.4.1
Ti consigliamo di utilizzare l'ultima versione di AGP per creare e gestire i profili di base. Di seguito sono riportate le principali funzionalità disponibili nelle diverse versioni di AGP:
| Versione AGP | Funzionalità |
|---|---|
| 9.1 |
Supporto completo della directory del set di risorse (moduli della libreria):
Oltre alle directory sensibili alle varianti, puoi dichiarare
più file di origine del profilo di baseline con un nome arbitrario, ad esempio
src/free/generated/baselineProfiles/baseline-prof1.txt,
per i moduli della libreria e per i moduli dell'app.
|
| 8.4 | Le installazioni locali di build non eseguibili in modalità debug che utilizzano lo strumento a riga di comando Gradle Wrapper o Android Studio installano i profili di base, in modo che il rendimento della build di release locale corrisponda più da vicino a quello di produzione. Questo aggiornamento non influisce sulle prestazioni di produzione dei profili di base. |
| 8,3 |
|
| 8.2 |
|
| 8,0 | Versione minima consigliata:utilizza il plug-in Gradle per i profili di base per generare profili di base con un singolo task Gradle.
|
| 7.4 |
Versione minima supportata:le app possono utilizzare i profili di baseline
dalle librerie e fornire il proprio profilo di baseline nel file
src/main/baseline-prof.txt.
|
Impostazioni dell'origine del profilo sensibili alle varianti
Utilizzando il plug-in Android per Gradle (AGP) versione 8.0 per le applicazioni e AGP versione 8.3 per le librerie, puoi inserire le regole del profilo di baseline in una directory di set di risorse dedicata, superando i vincoli di un singolo percorso fisso (ad esempio, src/main/baseline-prof.txt) e consentendo più file.
Ciò facilita un solido supporto delle varianti, consentendoti di definire profili di base distinti
adattati a tipi e build specifici (ad esempio,
utilizzando directory come src/variant/baselineProfiles/), il che garantisce
che le regole di ottimizzazione delle prestazioni vengano applicate con precisione a ogni applicazione
o libreria binaria univoca.
Esempio di generazione del profilo
Di seguito è riportato un esempio di classe per creare un profilo di baseline per l'avvio dell'app, nonché diversi eventi di navigazione e scorrimento utilizzando la libreria Macrobenchmark consigliata:
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
uiAutomator {
// App startup journey.
startApp(PACKAGE_NAME)
// Find and click elements using the new DSL
onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
onElement { viewIdResourceName == "myLazyColumn" }.also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
pressBack()
}
}
}
}
Per saperne di più sull'utilizzo della libreria UI Automator per automatizzare i percorsi utente, consulta Scrivere test automatici con UI Automator.
Puoi visualizzare questo codice nel contesto completo e con maggiori dettagli nella sezione Esempi di prestazioni su GitHub.
Cosa includere
Quando utilizzi i profili di base in un'app, puoi includere il codice di avvio dell'app e le interazioni comuni degli utenti, come la navigazione tra le schermate o lo scorrimento. Puoi anche raccogliere interi flussi come registrazione, accesso o pagamento. Qualsiasi percorso utente che ritieni critico può trarre vantaggio dai profili di base migliorando le prestazioni di runtime.
Se stai sperimentando approcci diversi per migliorare il rendimento, valuta la possibilità di includere i profili di base per entrambi i gruppi dell'esperimento. In questo modo, puoi semplificare l'interpretazione dei risultati assicurandoti che tutti gli utenti eseguano in modo coerente il codice compilato.
Le librerie possono fornire i propri profili di base e distribuirli con le release per migliorare le prestazioni delle app. Ad esempio, consulta la sezione Utilizzare un profilo di baseline in Prestazioni di Jetpack Compose.
Come funzionano i profili di baseline
Durante lo sviluppo dell'app o della libreria, valuta la possibilità di definire profili di base per coprire le interazioni utente comuni in cui il tempo di rendering o la latenza sono importanti. Ecco come funzionano:
Per la tua app vengono generate regole del profilo leggibili e compilate in formato binario nell'app. Puoi trovarle in
assets/dexopt/baseline.prof. Puoi quindi caricare l'Android App Bundle (AAB) su Google Play come di consueto.Google Play elabora il profilo e lo invia direttamente agli utenti insieme all'APK. Durante l'installazione, ART esegue la compilazione AOT dei metodi nel profilo, il che comporta l'esecuzione più rapida di questi metodi. Se il profilo contiene metodi utilizzati nell'avvio dell'app o durante il rendering dei frame, l'utente potrebbe riscontrare tempi di avvio più rapidi e una riduzione dei problemi di scattosità.
Questo flusso collabora con l'aggregazione dei profili cloud per ottimizzare le prestazioni in base all'utilizzo effettivo dell'app nel tempo.
Confrontare i profili di baseline e i profili di avvio
Utilizzi il plug-in Gradle per i profili di baseline per definire e produrre file di profili.
Questo plug-in si integra nel processo di compilazione e AGP compila queste regole del profilo leggibili in formato binario, compresso come baseline.prof all'interno dell'APK o dell'AAB, che ART può utilizzare in modo efficace per la compilazione sul dispositivo, a condizione che le dimensioni siano inferiori a 1,5 MB.
Questi file di profilo prodotti in genere vengono denominati startup-prof.txt e
baseline-prof.txt. Anche se i loro contenuti a volte possono sembrare simili,
soprattutto se ti concentri principalmente sulle startup, hanno scopi distinti
e influenzano il rendimento in fasi diverse:
profilo di baseline
Il file del profilo di baseline contiene un insieme completo di regole che Android Runtime (ART) utilizza per precompilare i percorsi di codice utilizzati di frequente, il che ottimizza le prestazioni dell'app non solo all'avvio.
Il file del profilo di baseline è in genere un superset delle regole presenti nel
profilo di avvio. Questo file include tutte le regole necessarie per l'ottimizzazione dell'avvio dell'app (generate tramite l'attività Gradle baselineProfile), nonché profili aggiuntivi per altri percorsi utente critici. Ad esempio, lo scorrimento
e la navigazione tra le diverse schermate.
Queste regole aggiuntive non di avvio vengono generate indipendentemente dal valore del campo di configurazione includeInStartupProfile.
Profilo startup
Il file del profilo di avvio contiene regole ottimizzate in modo specifico per il percorso di avvio dell'app. Durante la compilazione, D8 converte il bytecode Java in formato DEX.
R8 utilizza quindi questo file per influenzare il layout dei file DEX, assicurandosi
che il codice di avvio critico venga inserito nel file DEX principale per un'esecuzione
più rapida. In genere, devi impostare includeInStartupProfile su true solo per
scenari di test essenziali per la visualizzazione iniziale dell'app. Per saperne di più, consulta Crea profili di avvio.
Profili Cloud
I profili cloud offrono un'ulteriore forma di PGO, aggregata da Google Play Store e distribuita per la compilazione in fase di installazione, insieme ai profili di base.
Sebbene i profili cloud siano basati sulle interazioni degli utenti reali con l'app, la loro distribuzione richiede da diverse ore a giorni dopo un aggiornamento, limitandone la disponibilità. Finché i profili non vengono distribuiti completamente, le prestazioni delle app non sono ottimali per gli utenti di app nuove o aggiornate. Inoltre, i profili cloud supportano solo i dispositivi Android con Android 9 (livello API 28) o versioni successive e si adattano bene solo alle app con una base utenti sufficientemente ampia.
Comportamento della compilazione nelle varie versioni di Android
Le versioni della piattaforma Android utilizzano approcci di compilazione delle app diversi, ognuno con un compromesso di rendimento corrispondente. I profili di base migliorano i metodi di compilazione precedenti fornendo un profilo per tutte le installazioni.
| Versione di Android | Metodo di compilazione | Approccio di ottimizzazione |
|---|---|---|
| Da 5 a 6 (livello API da 21 a 23) | Full AOT | L'intera app viene ottimizzata durante l'installazione, con lunghi tempi di attesa per l'utilizzo dell'app, un maggiore utilizzo di RAM e spazio su disco e tempi più lunghi per caricare il codice dal disco, il che potrebbe aumentare i tempi di avvio a freddo. |
| Da 7 a 8.1 (livello API da 24 a 27) | AOT parziale (profilo di base) | I profili di base vengono
installati da
androidx.profileinstaller
alla prima esecuzione quando il
modulo dell'app definisce questa
dipendenza. ART può migliorare
ulteriormente questo aspetto
aggiungendo regole
del profilo aggiuntive
durante l'utilizzo dell'app
e compilando queste regole
quando il dispositivo è inattivo. In questo modo
si ottimizzano lo spazio su disco
e il tempo di caricamento del codice
dal disco, riducendo così
il tempo di attesa per l'app. |
| 9 (livello API 28) e versioni successive | AOT parziale (profilo di base + profilo Cloud) | Play utilizza i profili di base durante le installazioni di app per ottimizzare l'APK e i profili cloud, se disponibili. Dopo l'installazione, i profili ART vengono caricati su Play, aggregati e poi forniti come profili cloud ad altri utenti quando installano o aggiornano l'app. |
Problemi noti
Di seguito sono riportati i possibili problemi e le relative soluzioni o i problemi per i quali sono in corso sviluppi di soluzioni alternative:
La generazione del profilo di baseline potrebbe non riuscire a causa delle impostazioni delle autorizzazioni su alcuni dispositivi, inclusi quelli OnePlus. Per risolvere il problema, disattiva l'opzione Disattiva monitoraggio permessi nelle impostazioni delle Opzioni sviluppatore.
La generazione di profili di baseline non è supportata sui dispositivi Firebase Test Lab, inclusi i dispositivi Test Lab gestiti da Gradle (problema n. 285187547).
Per fornire correttamente i profili di baseline per le librerie, utilizza il plug-in Gradle per i profili di baseline 1.2.3 o AGP 8.3, come minimo (problema n. 313992099).
Se generi profili di base con il comando
./gradlew app:generateBaselineProfile, vengono eseguiti anche i benchmark nel modulo di test e i risultati vengono eliminati. In questo caso, puoi generare solo i profili di base eseguendo il comando con-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Questo problema è stato risolto in AGP 8.2.Il comando per generare profili di baseline per tutti i tipi di compilazione,
./gradlew app:generateBaselineProfile, genera profili di baseline solo per il tipo di compilazione di release. Questo problema è stato risolto in AGP 8.1.I canali di distribuzione delle app non Google Play Store potrebbero non supportare l'utilizzo dei profili di base durante l'installazione. Gli utenti delle app installate tramite questi canali non vedono i vantaggi finché non viene eseguito dexopt in background, il che avviene probabilmente durante la notte.
La condivisione interna delle app del Play Store non supporta i profili di base, ma il canale di test interno sì.
Le ottimizzazioni della batteria su alcuni dispositivi, come quelli Huawei, possono interferire con l'installazione del profilo. Per garantire che i profili vengano installati in modo efficace, disattiva tutte le ottimizzazioni della batteria nei dispositivi di riferimento.
Risorse aggiuntive
- Ottimizzazioni del layout DEX e profili di avvio
- Migliorare le prestazioni delle app con i profili di base
Consigliati per te
- Nota: il testo del link viene visualizzato quando JavaScript è disattivato
- Creare profili di base {:#creating-profile-rules}
- Creare e misurare i profili di base senza Macrobenchmark
- Ottimizzazioni del layout DEX e profili di avvio