I profili Baseline 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 un profilo di riferimento viene incluso in un'app o in una libreria, Android Runtime (ART) può ottimizzare i percorsi del codice specificati tramite la compilazione Ahead-of-Time (AOT), offrendo miglioramenti delle prestazioni per ogni nuovo utente e ogni aggiornamento dell'app. Questa ottimizzazione guidata dal profilo (PGO) consente alle app di ottimizzare l'avvio, ridurre i jank di interazione e migliorare le prestazioni complessive di runtime per gli utenti sin dal primo lancio.
Questi miglioramenti delle prestazioni si traducono direttamente in un miglioramento delle metriche aziendali, come la fidelizzazione degli utenti, le transazioni e le valutazioni. Puoi scoprire di più su come le prestazioni influiscono sulle metriche aziendali nelle storie di Josh, Lyft, TikTok e Zomato.
Vantaggi dei profili di baseline
I profili di riferimento 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 riferimento 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 utente comuni che migliorano il runtime dell'app dal primo lancio. 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. Se spedisci le release con un profilo di riferimento, le ottimizzazioni delle app diventano disponibili molto più velocemente rispetto a quando ti affidi solo ai profili cloud.
Quando non utilizzi un profilo di riferimento, 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 volta che la eseguono fino all'ottimizzazione dei nuovi percorsi del codice.
Molte app registrano 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 Crea profili di baseline.
Generazione di profili e build di release
È importante comprendere la differenza nelle configurazioni di compilazione richieste quando generi i file dei profili Baseline e di avvio (ad esempio, baseline-prof.txt e startup-prof.txt) rispetto a quando crei l'APK della release finale che utilizza questi profili.
Quando generi i file del profilo (ad esempio benchmark):
Quando acquisisci un profilo di riferimento con un test, l'app non deve essere offuscata.
Per assicurarti che le regole del profilo generate corrispondano con precisione alle firme dei metodi del codice, devi disattivare l'offuscamento e l'ottimizzazione (R8) per la variante di compilazione utilizzata per la generazione del profilo. Questa variante di compilazione deve essere diversa dalla variante di build di release, che ha l'offuscamento e l'ottimizzazione attivati. Per farlo, imposta isMinifyEnabled = false per la variante di compilazione della generazione del profilo. Se non utilizzi il plug-in Gradle per i profili Baseline, devi assicurarti che vengano applicati anche -dontobfuscate e -dontoptimize. Il plug-in Gradle per i profili di riferimento gestisce automaticamente questa configurazione per te.
Puoi verificare che la tua app non sia stata offuscata durante la generazione del profilo aprendo il file del profilo di testo generato (ad esempio, baseline-prof.txt) e controllando che i nomi delle classi e dei metodi non siano offuscati.
Quando crei l'APK della release finale:
Quando crei l'app di release, questa deve essere offuscata. La build di release deve avere isMinifyEnabled = true per trarre vantaggio dall'offuscamento, dalla minimizzazione e dall'ottimizzazione. R8 riscrive automaticamente le regole dai file del profilo non offuscati in modo che corrispondano al codice offuscato e ottimizzato nell'APK di release. La build sfrutta il file di testo non offuscato trasformando correttamente le regole.
Affinché l'ottimizzazione del layout DEX (basata sui profili di avvio) funzioni, l'app di release deve essere offuscata e utilizzare R8 con tutte le ottimizzazioni attivate.
Workflow avanzati (non Gradle):
Se utilizzi un workflow avanzato non Gradle (come Bazel, Buck o pipeline di automazione CI personalizzate) per generare i profili, devi comunque seguire gli stessi principi. L'app non deve essere offuscata o ottimizzata durante l'acquisizione del profilo. Tuttavia, quando crei l'app di release, devi offuscarla. R8 elabora il file delle regole di testo non offuscato e trasforma correttamente le regole da applicare all'app di release offuscata.
Versioni stabili minime consigliate
La catena di dipendenze fornisce versioni di release stabili e di sviluppo. Per generare e installare un profilo di riferimento, 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 riferimento ottimale.
- Plug-in Android per Gradle:
com.android.tools.build:8.0.0 - Libreria Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.5.0 - Profile Installer:
androidx.profileinstaller:profileinstaller:1.4.1
Ti consigliamo di utilizzare l'ultima versione di AGP per creare e gestire i profili di riferimento. Ecco le principali funzionalità incluse 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 di Baseline Profile con un nome arbitrario, ad esempio
src/free/generated/baselineProfiles/baseline-prof1.txt,
sia per i moduli della libreria che per i moduli dell'app.
|
| 8.4 | Le installazioni di app locali di build non abilitate al debug utilizzando lo strumento a riga di comando Gradle Wrapper o Android Studio installano i profili di riferimento, in modo che le prestazioni della build di release locale corrispondano più fedelmente alla produzione. Questo aggiornamento non influisce sulle prestazioni di produzione dei profili di riferimento. |
| 8,3 |
|
| 8.2 |
|
| 8,0 | Versione minima consigliata:utilizza il plug-in Gradle per i profili di baseline per generare profili di baseline con una singola attività Gradle.
|
| 7.4 |
Versione minima supportata: le app possono utilizzare i profili di riferimento
dalle librerie e fornire il proprio profilo di riferimento 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 dei profili di baseline in una directory del set di risorse dedicata, superando i vincoli di un singolo percorso fisso (ad esempio src/main/baseline-prof.txt) e consentendo più file.
In questo modo, viene fornito un supporto efficace per le varianti, consentendoti di definire profili di riferimento distinti e personalizzati per tipi e versioni di build specifici (ad esempio, utilizzando directory come src/variant/baselineProfiles/), il che garantisce che le regole di ottimizzazione delle prestazioni vengano applicate con precisione per ogni singolo file binario dell'applicazione o della libreria.
Esempio di generazione del profilo
Di seguito è riportato un esempio di classe per creare un profilo di riferimento 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 ulteriori informazioni sull'utilizzo della libreria UI Automator per automatizzare i percorsi dell'utente, consulta Scrivi test automatici con UI Automator.
Puoi visualizzare questo codice nel contesto completo e in modo più dettagliato nei nostri esempi di prestazioni su GitHub.
Cosa includere
Quando utilizzi i profili di riferimento in un'app, puoi includere il codice di avvio dell'app e le interazioni utente comuni, come la navigazione tra le schermate o lo scorrimento. Puoi anche raccogliere interi flussi, come la registrazione, l'accesso o il pagamento. Tutti i percorsi dell'utente che ritieni critici possono trarre vantaggio dai profili di riferimento migliorando le prestazioni di runtime.
Se stai sperimentando approcci diversi per migliorare le prestazioni, valuta la possibilità di includere i profili di riferimento 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 riferimento e spedirli con le release per migliorare le prestazioni dell'app. Ad esempio, consulta la sezione Utilizza un profilo di riferimento in Prestazioni di Jetpack Compose.
Come funzionano i profili di riferimento
Durante lo sviluppo dell'app o della libreria, valuta la possibilità di definire profili di riferimento per coprire le interazioni utente comuni in cui il tempo di rendering o la latenza sono importanti. Ecco come funzionano:
Le regole del profilo leggibili vengono generate per la tua app 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, con conseguente 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 un jank ridotto.
Questo flusso collabora con l'aggregazione dei profili Cloud per ottimizzare le prestazioni in base all'utilizzo effettivo dell'app nel tempo.
Confronta i profili di baseline e i profili di avvio
Utilizza il plug-in Gradle del profilo di riferimento per definire e produrre file di profilo.
Questo plug-in si aggancia al processo di build e AGP compila queste regole del profilo leggibili dall'uomo in un formato binario, pacchettizzato come baseline.prof all'interno dell'APK o dell'AAB, che ART può utilizzare in modo efficace per la compilazione on-device, a condizione che sia inferiore a 1,5 MB.
I file del profilo generati sono in genere denominati startup-prof.txt e
baseline-prof.txt. Anche se i loro contenuti a volte possono sembrare simili, soprattutto se ti concentri principalmente sull'avvio, hanno scopi distinti e influenzano le prestazioni in fasi diverse:
profilo di baseline
Il file del profilo di riferimento contiene un insieme completo di regole che Android Runtime (ART) utilizza per precompilare i percorsi del codice utilizzati di frequente, ottimizzando le prestazioni dell'app non solo all'avvio.
Il file del profilo di riferimento è 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), insieme a profili aggiuntivi per altri Critical User Journey. Ad esempio, lo scorrimento
e la navigazione tra schermate diverse.
Queste regole aggiuntive, non di avvio, vengono generate indipendentemente dal valore del campo di configurazione includeInStartupProfile.
Profilo della startup
Il file del profilo di avvio contiene regole ottimizzate specificamente per il percorso di avvio della tua app. Durante la compilazione, D8 converte il bytecode Java nel 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 gli 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 una forma aggiuntiva di PGO, aggregata dal Google Play Store e distribuita per la compilazione al momento dell'installazione, insieme ai profili Baseline.
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 dell'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 scalano bene solo per le app con una base utenti sufficientemente ampia.
Comportamento di compilazione nelle versioni di Android
Le versioni della piattaforma Android utilizzano approcci di compilazione delle app diversi, ognuno con un corrispondente compromesso in termini di prestazioni. I profili di riferimento 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) | AOT completo | L'intera app viene ottimizzata durante l'installazione, il che comporta tempi di attesa lunghi per l'utilizzo dell'app, un maggiore utilizzo della RAM e dello spazio su disco e tempi più lunghi per il caricamento del codice dal disco, con un potenziale aumento dei tempi di avvio a freddo. |
| 7 fino a 8.1 (livello API 24 fino a 27) | AOT parziale (profilo di baseline) | I profili di riferimento vengono installati da androidx.profileinstaller alla prima esecuzione quando il modulo dell'app definisce questa dipendenza. ART può migliorare ulteriormente questo aspetto aggiungendo regole di profilo aggiuntive durante l'utilizzo dell'app e compilandole quando il dispositivo è inattivo. In questo modo,
si ottimizza 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 baseline + profilo Cloud) | Play utilizza i profili di riferimento durante le installazioni delle app per ottimizzare l'APK e i profili Cloud, se disponibili. Dopo l'installazione, i profili ART vengono caricati su Google 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 per soluzioni alternative:
La generazione del profilo di riferimento potrebbe non riuscire a causa delle impostazioni di autorizzazione su alcuni dispositivi, inclusi i dispositivi OnePlus. Per risolvere il problema, disattiva l'opzione Disattiva monitoraggio autorizzazioni nelle impostazioni Opzioni sviluppatore.
Per fornire correttamente i profili Baseline per le librerie, utilizza almeno il plug-in Gradle per i profili Baseline 1.2.3 o AGP 8.3 (problema n. 313992099).
Se generi i profili di riferimento con il comando
./gradlew app:generateBaselineProfile, vengono eseguiti anche i benchmark nel modulo di test e i risultati vengono ignorati. In questo caso, puoi generare solo i profili di riferimento eseguendo il comando con-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Questo problema è stato risolto in AGP 8.2.Il comando per generare i profili di riferimento per tutti i tipi di build,
./gradlew app:generateBaselineProfile, genera i profili di riferimento solo per il tipo di build di release. Questo problema è stato risolto in AGP 8.1.I canali di App Distribution diversi dal Google Play Store potrebbero non supportare l'utilizzo dei profili di baseline al momento dell'installazione. Gli utenti delle app installate tramite questi canali non vedono i vantaggi finché non viene eseguito dexopt in background, il che probabilmente avviene durante la notte.
La condivisione interna delle app del Play Store non supporta i profili Baseline, a differenza del canale di test interno.
Le ottimizzazioni della batteria su alcuni dispositivi, ad esempio quelli Huawei, possono interferire con l'installazione del profilo. Per assicurarti che i profili vengano installati correttamente, disattiva le ottimizzazioni della batteria nei dispositivi di benchmark.
Risorse aggiuntive
- Ottimizzazioni del layout DEX e profili di avvio
- Migliora le prestazioni delle app con i profili di baseline
Consigliati per te
- Nota: il testo del link viene visualizzato quando JavaScript è disattivato
- Crea profili di riferimento {:#creating-profile-rules}
- Crea e misura i profili di riferimento senza Macrobenchmark
- Ottimizzazioni del layout DEX e profili di avvio