Panoramica dei profili di riferimento

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 di codice inclusi.

Se includi un profilo di base 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 ottimizzazione guidata dal profilo (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 degli 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 rendono più fluide tutte le interazioni degli utenti, come l'avvio dell'app, la navigazione tra le schermate o lo scorrimento dei contenuti, 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 ritorno medio più elevato.

I profili di base 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 un computer di sviluppo anziché su un dispositivo mobile. Se pubblichi release con un profilo di base, le ottimizzazioni delle app diventano disponibili molto più rapidamente rispetto a quando si fa affidamento solo sui profili cloud.

Quando non viene utilizzato un profilo di base, 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 misurano un aumento delle prestazioni di circa il 30% dopo l'ottimizzazione.

Profili startup

I profili di avvio sono simili ai profili di base, ma la differenza è che vengono utilizzati in fase di compilazione anziché per l'ottimizzazione sul dispositivo. Un profilo di avvio viene utilizzato per ottimizzare il layout del file DEX per migliorare i tempi di avvio. Il codice identificato nel profilo di avvio viene inserito nel file classes.dex principale, mentre l'altro codice viene inserito in file DEX separati. In questo modo i tempi di avvio migliorano perché si riduce il numero di errori di pagina durante l'avvio dell'app. Per scoprire di più su come i profili di avvio e le ottimizzazioni del layout DEX possono migliorare i tempi di avvio delle app, consulta Ottimizzazioni del layout DEX e profili di avvio.

Inizia

Per iniziare a ottimizzare le prestazioni nella tua app esistente, consulta Creare profili di base.

La catena di dipendenze fornisce versioni di rilascio stabili e di sviluppo. Per generare e installare un profilo di base, 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 abilitare un profilo di base ottimale.

  • Plug-in Android per Gradle: com.android.tools.build:8.0.0
  • Libreria Macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.3.4
  • 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à
8.4 Le installazioni locali di app di build non eseguibili in modalità debug utilizzando lo strumento da riga di comando Gradle Wrapper o Android Studio installano i profili di base, in modo che le prestazioni della build di release locale corrispondano più da vicino a quelle di produzione. Questo aggiornamento non influisce sulle prestazioni di produzione dei profili di base.
8.3
  • Supporto completo della directory del set di origini (moduli della libreria): dichiara più file di origine del profilo di base e utilizza directory sensibili alle varianti, ad esempio src/free/generated/baselineProfiles/baseline-prof1.txt, ora anche per i moduli della libreria, oltre che per i moduli dell'app.
  • I profili di base includono classi desugarizzate.
8.2
  • Riscrittura delle regole R8:D8 e R8 possono trasformare le regole di Baseline e Startup Profile leggibili dall'uomo per acquisire completamente tutte le regole necessarie per ottimizzare il rendimento dell'app. Aumenta la copertura dei metodi del profilo di base di circa il 30% e migliora le prestazioni dell'app di circa il 15%.
  • Profili di avvio:genera questo nuovo tipo di profilo di base per informare il layout del codice all'interno di DEX. Aumenta le prestazioni di avvio di un ulteriore ~15% o molto di più per le app di grandi dimensioni.
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.
  • Supporto completo della directory del set di origini (moduli dell'app): dichiara più file di origine del profilo di base 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 base dalle librerie e fornire il proprio profilo di base nel file src/main/baseline-prof.txt.
  • I profili di base vengono pacchettizzati correttamente durante la creazione dell'APK da un app bundle (problema n. 230361284).
  • Per le app con più di un file .dex, i profili di base vengono pacchettizzati correttamente per il file .dex principale.

Esempio di generazione del profilo

Di seguito è riportato un esempio di classe per creare un profilo di base per l'avvio dell'app, nonché diversi eventi di navigazione e scorrimento utilizzando la libreria Macrobenchmark consigliata:

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

Puoi visualizzare questo codice nel contesto completo e in modo più dettagliato nella sezione Esempi di rendimento 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 la registrazione, l'accesso o il 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 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 il rendimento delle app. Ad esempio, consulta la sezione Utilizzare un profilo di base 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:

  1. Per la tua app vengono generate regole del profilo leggibili e compilate in formato binario nell'app. Puoi trovarle in assets/dexopt/baseline.prof. Dopodiché potrai caricare l'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 conseguente esecuzione più rapida. 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à.

  3. Questo flusso collabora con l'aggregazione dei profili cloud per ottimizzare le prestazioni in base all'utilizzo effettivo dell'app nel tempo.

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

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 reali degli utenti 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 scalano bene solo per le 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 corrispondente in termini di prestazioni. 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) AOT completo L'intera app viene ottimizzata durante l'installazione, il che comporta 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 di 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 possibili problemi e soluzioni o problemi per i quali sono in corso sviluppi di soluzioni alternative:

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

  • La generazione di profili di base non è supportata sui dispositivi Firebase Test Lab, inclusi i dispositivi Test Lab gestiti da Gradle (problema n. 285187547).

  • Per fornire correttamente i profili di base per le librerie, utilizza il plug-in Gradle per i profili di base 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 base per tutti i tipi di build, ./gradlew app:generateBaselineProfile, genera profili di base solo per il tipo di build 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