Panoramica dei profili di riferimento

I profili di 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) percorsi del codice inclusi.

Se includi un profilo di baseline in un'app o in una libreria, Android Runtime (ART) può ottimizzare i percorsi del codice specificati tramite la compilazione Ahead-of-Time (AOT), fornendo 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 il jank di interazione e migliorare le prestazioni di runtime complessive per gli utenti dal primo avvio.

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 il rendimento influisce sulle metriche aziendali nelle storie di Josh, Lyft, TikTok e Zomato.

Vantaggi dei profili di baseline

I profili di baseline 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 baseline 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 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. Se includi un profilo di baseline nelle release, le ottimizzazioni delle app diventano disponibili molto più rapidamente rispetto a quando si utilizzano solo profili cloud.

Quando non viene utilizzato un profilo di baseline, tutto il codice dell'app viene compilato JIT in memoria dopo essere stato interpretato oppure scritto in un file odex in background quando il dispositivo è inattivo. Dopo l'installazione o l'aggiornamento di un'app, gli utenti hanno un'esperienza non ottimale dalla prima esecuzione fino a quando i nuovi percorsi del codice non vengono ottimizzati. Molte app misurano aumenti di rendimento 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 il rendimento dell'app esistente, consulta Creare profili di baseline.

Generazione del profilo rispetto alle build di release

È importante comprendere la differenza tra le configurazioni di build richieste quando si generano file di profili di baseline e di avvio (ad esempio, baseline-prof.txt e startup-prof.txt) e quando si crea l'APK di release finale che utilizza questi profili.

Quando generi i file di profilo (ad esempio, benchmark):

Per assicurarti che le regole del profilo generato corrispondano con precisione 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 build di release, per la quale sono attivi l'offuscamento e l'ottimizzazione. Per farlo, imposta isMinifyEnabled = false per la variante di compilazione di generazione del profilo. Se non utilizzi il plug-in Gradle del profilo di baseline, devi anche assicurarti che vengano applicati -dontobfuscate e -dontoptimize. Il plug-in Gradle del profilo di baseline gestisce automaticamente questa configurazione.

Quando crei l'APK di release finale:

La build di release deve sempre avere isMinifyEnabled = true per usufruire dell'offuscamento, della riduzione e dell'ottimizzazione. R8 riscrive automaticamente le regole dei 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 release deve essere offuscata e utilizzare R8 con tutte le ottimizzazioni attive.

La catena di dipendenze fornisce versioni di release 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
  • Profile Installer: androidx.profileinstaller:profileinstaller:1.4.1

Ti consigliamo di utilizzare l'ultima versione di AGP per creare e gestire i profili di baseline. Di seguito sono riportate le principali funzionalità disponibili con le diverse versioni di AGP:

Versione di 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à di debug utilizzando lo strumento della riga di comando del wrapper Gradle o Android Studio installano i profili di baseline, in modo che il rendimento della build di release locale corrisponda più da vicino alla produzione. Questo aggiornamento non influisce sul rendimento di produzione dei profili di baseline.
8.3
  • Supporto parziale della directory del set di risorse (moduli della libreria): dichiara i file di profilo di baseline sensibili alle varianti, ad esempio src/free/generated/baselineProfiles/baseline-prof.txt, per i moduli della libreria.
  • I profili di baseline includono classi desugarizzate.
8.2
  • Riscrizione delle regole R8: D8 e R8 possono trasformare le regole dei profili di baseline e di avvio leggibili in formato binario per acquisire completamente tutte le regole necessarie per ottimizzare le prestazioni dell'app. In questo modo puoi generare profili da una build non ridotta e applicarli a una build di release ridotta. Aumenta la copertura dei metodi del profilo di baseline di circa il 30% e le prestazioni dell'app di circa il 15%.
  • Profili di avvio: genera questo tipo di profilo di baseline per informare il layout del codice all'interno di DEX. Aumenta il rendimento di avvio di un ulteriore 15% circa o in modo significativo per le app di grandi dimensioni.
8.0 Versione minima consigliata: utilizza il plug-in Gradle del profilo di baseline per generare profili di baseline con una singola attività Gradle.
  • Supporto completo della directory del set di risorse (moduli dell'app): dichiara più file di origine del profilo di baseline e utilizza directory sensibili alle varianti, ad esempio src/free/generated/baselineProfiles/baseline-prof1.txt.
7.4 Versione minima supportata: le app possono utilizzare i profili di baseline delle librerie e fornire il proprio profilo di baseline nel src/main/baseline-prof.txt file.
  • I profili di baseline vengono inclusi correttamente nel pacchetto quando crei l'APK da un app bundle (problema n. 230361284).
  • Per le app con più di un .dex file, i profili di baseline vengono inclusi correttamente nel pacchetto per il file .dex principale.
  • D8 e R8 supportano la generazione di profili di avvio da una build in cui isMinifyEnabled è impostato su false.

Impostazioni dell'origine del profilo sensibili alle varianti

Se utilizzi 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 del set di risorse dedicata, superando i vincoli di un singolo percorso fisso (ad esempio, src/main/baseline-prof.txt) e attivando più file.

In questo modo è più facile supportare le varianti, consentendoti di definire profili di baseline distinti personalizzati per versioni e build specifiche (ad esempio, utilizzando directory come src/variant/baselineProfiles/), il che garantisce che le regole di ottimizzazione del rendimento vengano applicate con precisione per ogni file binario di applicazione o libreria univoco.

Esempio di generazione del profilo

Di seguito è riportata una classe di esempio 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 automatizzati con UI Automator.

Puoi visualizzare questo codice nel contesto completo e con maggiori dettagli come parte dei nostri esempi di rendimento su GitHub.

Cosa includere

Quando utilizzi i profili di baseline 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. Qualsiasi percorso utente che ritieni critico può trarre vantaggio dai profili di baseline migliorando il rendimento di runtime.

Se stai sperimentando approcci diversi per migliorare il rendimento, valuta la possibilità di includere i profili di baseline per entrambi i gruppi dell'esperimento. In questo modo, puoi rendere i risultati più facili da interpretare assicurandoti che tutti gli utenti eseguano costantemente il codice compilato.

Le librerie possono fornire i propri profili di baseline e includerli nelle release per migliorare le prestazioni dell'app. Ad esempio, consulta la sezione Utilizzare un profilo di baseline in Rendimento di Jetpack Compose.

Come funzionano i profili di baseline

Durante lo sviluppo dell'app o della libreria, valuta la possibilità di definire i profili di baseline per coprire le interazioni utente comuni in cui il tempo di rendering o la latenza sono importanti. Ecco come funzionano:

  1. Le regole del profilo leggibili vengono generate per l'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.

  2. 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 il risultato che questi metodi vengono eseguiti più rapidamente. Se il profilo contiene metodi utilizzati all'avvio dell'app o durante il rendering dei frame, l'utente potrebbe riscontrare tempi di avvio più rapidi e un jank ridotto.

  3. Questo flusso funziona in combinazione con l'aggregazione dei profili cloud per ottimizzare il rendimento in base all'utilizzo effettivo dell'app nel tempo.

Figura 1. Questo diagramma mostra il flusso di lavoro del profilo di baseline dal caricamento alla distribuzione all'utente finale e il modo in cui questo flusso di lavoro è correlato ai profili cloud.

Confrontare i profili di baseline e i profili di avvio

Utilizza il plug-in Gradle del profilo di baseline per definire e produrre i file di profilo. Questo plug-in si integra nel processo di build e AGP compila queste regole di profilo leggibili in un formato binario, incluso nel pacchetto 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 sia inferiore a 1,5 MB.

I file di profilo prodotti in genere vengono denominati startup-prof.txt e baseline-prof.txt. Sebbene i loro contenuti a volte possano sembrare simili, soprattutto se ti concentri principalmente sull'avvio, 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 del codice utilizzati di frequente, il che ottimizza le prestazioni dell'app oltre l'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), insieme a 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 di avvio

Il file del profilo di avvio contiene regole ottimizzate specificamente 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 gli scenari di test essenziali per la visualizzazione iniziale dell'app. Per saperne di più, consulta Creare 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 baseline.

Sebbene i profili cloud siano basati sulle interazioni utente reali con l'app, la loro distribuzione richiede diverse ore o giorni dopo un aggiornamento, limitandone la disponibilità. Fino a quando i profili non vengono distribuiti completamente, il rendimento dell'app non è ottimale 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 compromesso di rendimento corrispondente. I profili di baseline 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, con conseguenti tempi di attesa lunghi per l'utilizzo dell'app, aumento dell'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 baseline) I profili di baseline vengono installati da androidx.profileinstaller alla prima esecuzione quando il modulo dell'app definisce questa dipendenza. ART può migliorare ulteriormente questo aspetto aggiungendo altre regole di profilo 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 baseline + cloud) Play utilizza i profili di baseline durante le installazioni delle app per ottimizzare l'APK e i profili cloud, se disponibili. Dopo l'installazione, i profili ART vengono caricati su Play, aggregati e quindi 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 oppure i problemi per i quali sono in corso sviluppi per le soluzioni alternative:

  • La generazione del profilo di baseline potrebbe non riuscire a causa delle impostazioni delle autorizzazioni su alcuni dispositivi, inclusi i dispositivi OnePlus. Per risolvere il problema, disattiva l'opzione Disattiva il monitoraggio delle autorizzazioni nelle impostazioni Opzioni sviluppatore.

  • Per fornire correttamente i profili di baseline per le librerie, utilizza il plug-in Gradle del profilo di baseline 1.2.3 o AGP 8.3, come minimo (problema n. 313992099).

  • Se generi i profili di baseline 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 baseline 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 baseline per tutti i tipi di build, ./gradlew app:generateBaselineProfile, genera solo i profili di baseline per il tipo di build di release. Questo problema è stato risolto in AGP 8.1.

  • I canali di distribuzione delle app non di Google Play Store potrebbero non supportare l'utilizzo dei profili di baseline durante l'installazione. Gli utenti delle app installate tramite questi canali non vedono i vantaggi fino all'esecuzione di dexopt in background, che probabilmente avviene durante la notte.

  • La condivisione interna delle app di Play Store non supporta i profili di baseline, ma il canale di test interno sì.

  • Le ottimizzazioni della batteria su alcuni dispositivi, come i dispositivi Huawei, possono interferire con l'installazione del profilo. Per assicurarti che i profili vengano installati in modo efficace, disattiva tutte le ottimizzazioni della batteria nei dispositivi di benchmark.

Risorse aggiuntive

Consigliati per te