Panoramica dei profili di riferimento

I profili di riferimento migliorano la velocità di esecuzione del codice di circa il 30% dal primo lancio evitando i passaggi di interpretazione e di compilazione just-in-time (JIT) per i percorsi di codice inclusi.

Inviando un profilo di riferimento in un'app o una libreria, Android Runtime (ART) può ottimizzare i percorsi di codice specificati tramite la compilazione AOT (Ahead-of-Time), fornendo miglioramenti delle prestazioni per ogni nuovo utente e ogni aggiornamento dell'app. L'ottimizzazione guidata per i profili (PGO) consente alle app di ottimizzare l'avvio, ridurre il numero di interazioni e migliorare le prestazioni di runtime complessive per gli utenti sin dal primo lancio.

Questi miglioramenti delle prestazioni migliorano direttamente le 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 notizie di Josh, Lyft, TikTok e Zomato.

Vantaggi dei profili di riferimento

I profili di riferimento rendono più fluide tutte le interazioni degli utenti, ad esempio 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 riferimento possono portare a un maggior numero di utenti attivi giornalieri e a un tasso medio di visite di ritorno più elevato.

I profili di riferimento aiutano a indirizzare l'ottimizzazione oltre l'avvio dell'app, fornendo interazioni comuni degli utenti che migliorano il runtime dell'app sin 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 che affidarsi solo ai profili Cloud.

Se non utilizzi un profilo di riferimento, tutto il codice dell'app viene compilato in memoria JIT dopo essere stato interpretato o scritto in un file odex in background quando il dispositivo è inattivo. Dopo l'installazione o l'aggiornamento di un'app, l'esperienza degli utenti non è ottimale dalla prima volta che la eseguono fino all'ottimizzazione dei nuovi percorsi del codice. Molte app misurano gli aumenti delle prestazioni di circa il 30% dopo l'ottimizzazione.

Profili di avvio

I profili di avvio sono simili ai profili di riferimento, ma la differenza è che vengono utilizzati in fase di compilazione anziché per l'ottimizzazione sul dispositivo. Viene utilizzato un profilo di avvio per ottimizzare il layout del file DEX al fine di migliorare i tempi di avvio. Il codice identificato nel profilo di avvio viene inserito nel file classes.dex principale, mentre l'altro codice in file DEX separati. Questo migliora i tempi di avvio riducendo 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 l'articolo Ottimizzazioni del layout DEX e profili di avvio.

Inizia

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

La catena di dipendenze fornisce versioni di release stabili e di sviluppo. Per generare e installare un profilo Baseline, usa le seguenti versioni supportate o successive del plug-in Android per Gradle, della libreria Macrobenchmark e del programma di installazione del profilo. Queste dipendenze sono necessarie in momenti diversi e funzionano insieme come una catena di strumenti per abilitare 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.2.4
  • Programma di installazione del profilo: androidx.profileinstaller:profileinstaller:1.3.1

Per creare e gestire i profili di riferimento, consigliamo di utilizzare la versione più recente di AGP. Ecco le principali funzionalità delle diverse versioni di AGP:

Versione AGP Funzionalità
8.3
  • Supporto completo delle directory dei set di origini (moduli di libreria): dichiara più file di origine del profilo di riferimento e utilizza directory sensibili alle varianti, come src/free/generated/baselineProfiles/baseline-prof1.txt, ora per i moduli delle librerie e per i moduli dell'app.
  • I profili di riferimento includono le classi target.
8.2
  • Riscrittura delle regole R8:D8 e R8 possono trasformare le regole di riferimento e del profilo di avvio leggibili per acquisire completamente tutte le regole necessarie per ottimizzare le prestazioni dell'app. Aumenta la copertura dei metodi del profilo di riferimento di circa il 30% e le prestazioni dell'app di circa il 15%.
  • Profili di avvio: genera questo nuovo tipo di profilo di riferimento per definire il layout del codice in DEX. Aumenta le prestazioni di avvio di un ulteriore 15% circa o molto di più per le app di grandi dimensioni.
con Android 8.0 Versione minima consigliata:usa il plug-in Gradle Baseline Profile per generare profili Baseline con una singola attività Gradle.
  • Supporto completo della directory dei set di origini (moduli dell'app): dichiara più file di origine del profilo di riferimento e utilizza directory sensibili alle varianti, come src/free/generated/baselineProfiles/baseline-prof1.txt.
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.
  • I profili di riferimento 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 riferimento vengono pacchettizzati correttamente per il file .dex principale.

Esempio di generazione del profilo

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

@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 con maggiori dettagli 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 comuni degli utenti, come la navigazione tra le schermate o lo scorrimento. Puoi anche raccogliere interi flussi, ad esempio registrazione, accesso o pagamento. Qualsiasi percorso dell'utente che ritieni critico può trarre vantaggio dai profili di riferimento migliorando le prestazioni di runtime.

Se stai sperimentando diversi approcci per migliorare il rendimento, valuta la possibilità di includere i profili di riferimento per entrambi i gruppi dell'esperimento. In questo modo, puoi semplificare l'interpretazione dei risultati garantendo che tutti gli utenti eseguano in modo coerente il codice compilato.

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

Come funzionano i profili di riferimento

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

  1. Le regole del profilo leggibili da parte di persone vengono generate per la tua app 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 spedisce direttamente agli utenti insieme all'APK. Durante l'installazione, ART esegue la compilazione AOT dei metodi nel profilo, che vengono eseguiti più rapidamente. 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 numero ridotto di jank.

  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 riferimento, dal caricamento alla consegna dell'utente finale, e la relazione tra il flusso di lavoro e i profili Cloud.

Profili cloud

I profili Cloud offrono una forma aggiuntiva di PGO, aggregate da Google Play Store e distribuito per la compilazione dei tempi di installazione, insieme ai profili di riferimento.

Sebbene i profili Cloud siano basati sulle interazioni reali degli utenti con l'app, dopo la distribuzione di un aggiornamento sono necessarie diverse ore o diversi giorni, limitandone la disponibilità. Finché i profili non sono completamente distribuiti, 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 scalano bene solo per le app che hanno una base utenti sufficientemente grande.

Comportamento della compilazione nelle versioni Android

Le versioni della piattaforma Android utilizzano approcci di compilazione delle app diversi, ciascuno con un compromesso in termini di prestazioni. I profili di riferimento migliorano rispetto ai precedenti metodi di compilazione fornendo un profilo per tutte le installazioni.

Versione di Android Metodo di compilazione Approccio all'ottimizzazione
Da 5 a 6 (livello API 21 fino a 23) AOT completo L'intera app è ottimizzata durante l'installazione, con conseguenti lunghi tempi di attesa per l'utilizzo dell'app, maggiore utilizzo di RAM e spazio su disco e tempi più lunghi per caricare il codice dal disco, con un potenziale aumento dei tempi di avvio a freddo.
Da 7 a 8,1 (livello API 24 fino a 27) AOT parziale (profilo di riferimento) 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 ulteriori regole di profilo durante l'utilizzo dell'app e compilandole quando il dispositivo è inattivo. Questa operazione ottimizza lo spazio su disco e il tempo per caricare il codice dal disco, riducendo così il tempo di attesa per l'app.
9 (livello API 28) e superiore AOT parziale (base di riferimento + profilo cloud) Play utilizza i profili di riferimento durante le installazioni di app per ottimizzare i profili APK e 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 soluzioni o i problemi per i quali sono in corso sviluppi di soluzioni alternative:

  • La generazione del profilo 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 riferimento per le librerie, utilizza almeno il plug-in Gradle del profilo base 1.2.3 o AGP 8.3 (numero 313992099).

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

  • I canali di distribuzione delle app non appartenenti al Google Play Store potrebbero non supportare l'uso dei profili di riferimento al momento dell'installazione. Gli utenti delle app installate attraverso questi canali non usufruiscono dei vantaggi finché non viene eseguito l'opt-out in background, probabilmente da un giorno all'altro.

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

  • Le ottimizzazioni della batteria di alcuni dispositivi, ad esempio i dispositivi Huawei, possono interferire con l'installazione del profilo. Per assicurarti che i profili siano installati correttamente, disattiva le ottimizzazioni della batteria nei dispositivi di benchmark.

Risorse aggiuntive