Panoramica dei profili di riferimento

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

Se invii un profilo di riferimento in un'app o una libreria, il runtime Android (ART) può ottimizzare percorsi di codice specifici 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 problemi di interazione e migliorare il rendimento complessivo del runtime per gli utenti fin 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 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 aumento degli utenti attivi giornalieri e a un tasso di visite di ritorno medio più elevato.

I profili di riferimento aiutano a guidare l'ottimizzazione oltre l'avvio dell'app fornendo interazioni comuni con gli utenti che migliorano il tempo di esecuzione 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 pubblichi le release con un profilo di riferimento, le ottimizzazioni delle app diventano disponibili molto più rapidamente rispetto all'utilizzo unicamente dei profili cloud.

Se non utilizzi un profilo di riferimento, tutto il codice dell'app viene compilato in modalità 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 suboptimale dalla prima volta che la eseguono fino a quando i nuovi percorsi di codice non vengono ottimizzati. 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 riferimento, 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 al fine di migliorare i tempi di avvio. Il codice identificato nel profilo di avvio viene inserito nel file classes.dex principale e l'altro codice viene inserito in file DEX separati. In questo modo, i tempi di avvio vengono ridotti 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 Ottimizzazioni del layout DEX e profili di avvio.

Inizia

Per iniziare a ottimizzare il rendimento 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 di riferimento, utilizza le seguenti versioni supportate o superiori del plug-in Android per Gradle, della libreria Macrobenchmark e di Profile Installer. Queste dipendenze sono necessarie in momenti diversi e agiscono insieme come toolchain per attivare un profilo di riferimento ottimale.

  • Plug-in Android Gradle: com.android.tools.build:8.0.0
  • Libreria macrobenchmark: androidx.benchmark:benchmark-macro-junit4:1.3.3
  • Profile Installer: androidx.profileinstaller:profileinstaller:1.4.1

Ti consigliamo di utilizzare la versione più recente di AGP per creare e gestire i profili di riferimento. Di seguito sono riportate le principali funzionalità disponibili nelle diverse versioni di AGP:

Versione AGP Funzionalità
8.4 Installazioni di app locali di build non debbugabili utilizzando lo strumento a riga di comando del wrapper Gradle o i profili di riferimento di Android Studio, in modo che il rendimento della release build locale corrisponda più da vicino alla produzione. Questo aggiornamento non influisce sul rendimento produttivo dei profili di riferimento.
8.3
  • Supporto completo della directory dell'insieme di origini (moduli della 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 della libreria e per i moduli dell'app.
  • I profili di riferimento includono classi desugared.
8.2
  • Riscrivitura delle regole in R8:D8 e R8 possono trasformare le regole di profilo di base e di avvio leggibili da persone per acquisire completamente tutte le regole necessarie per ottimizzare il rendimento dell'app. Aumenta la copertura del profilo di riferimento dei metodi di circa il 30% e il rendimento dell'app di circa il 15%.
  • Profili di avvio:genera questo nuovo tipo di profilo di riferimento per indicare il layout del codice all'interno di DEX. Aumenta il rendimento all'avvio di un altro ~15% o in misura maggiore per le app di grandi dimensioni.
8.0 Versione minima consigliata: utilizza il plug-in Gradle Baseline Profile per generare profili di riferimento con un'unica attività Gradle.
  • Supporto completo della directory dell'insieme di origini (moduli dell'app): dichiara più file di origine del profilo di riferimento e utilizza directory consapevoli delle 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 compilazione dell'APK da un app bundle (issue #230361284).
  • Per le app con più di un file .dex, i profili di riferimento sono 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 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 nell'ambito dei nostri esempi di rendimento 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, come registrazione, accesso o pagamento. Qualsiasi percorso dell'utente che ritieni fondamentale può trarre vantaggio dai profili di riferimento migliorando il rendimento in fase di esecuzione.

Se stai sperimentando approcci diversi per migliorare il rendimento, prendi in considerazione l'inclusione dei 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 distribuirli con le release per migliorare il rendimento delle app. Ad esempio, consulta la sezione Utilizzare un profilo di riferimento nel rendimento di Jetpack Compose.

Come funzionano i profili di riferimento

Durante lo sviluppo dell'app o della libreria, ti consigliamo di definire i profili di riferimento 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 da persone vengono generate per la tua app e compilate in forma binaria nell'app. Puoi trovarle in assets/dexopt/baseline.prof. Dopodiché puoi 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, in modo che vengano 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 una riduzione del jitter.

  3. Questo flusso collabora con l'aggregazione di Cloud Profiles 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 riferimento dal caricamento alla consegna all'utente finale e la relativa relazione con i profili cloud.

Profili cloud

I profili cloud offrono una forma aggiuntiva di PGO, aggregata da Google Play Store e distribuita per la compilazione al momento dell'installazione, insieme ai profili di riferimento.

Sebbene i profili cloud siano basati sulle interazioni reali degli utenti con l'app, la loro distribuzione richiede da diverse ore a diversi giorni dopo un aggiornamento, limitandone la disponibilità. Fino a quando i profili non saranno completamente distribuiti, le prestazioni delle app non saranno ottimali per gli utenti di app nuove o aggiornate. Inoltre, Cloud Profiles supporta solo i dispositivi Android con Android 9 (livello API 28) o superiori e si adatta bene solo alle app con una base utenti sufficientemente ampia.

Comportamento di compilazione nelle varie versioni di Android

Le versioni della piattaforma Android utilizzano approcci di compilazione delle app diversi, ciascuno con un compromesso sul rendimento corrispondente. I profili di riferimento migliorano i metodi di compilazione precedenti fornendo un profilo per tutte le installazioni.

Versione di Android Metodo di compilazione Approccio all'ottimizzazione
Da 5 a 6 (livello API da 21 a 23) AOT completo L'intera app viene ottimizzata durante l'installazione, con conseguente lunghi tempi di attesa per l'utilizzo dell'app, aumento dell'utilizzo della RAM e dello spazio su disco e tempi più lunghi per caricare il codice dal disco, con un potenziale aumento dei tempi di avvio a freddo.
7 fino ad Android 8.1 (livello API da 24 a 27) AOT parziale (profilo di base) 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, viene ottimizzato lo spazio su disco e il tempo necessario per caricare il codice dal disco, riducendo così il tempo di attesa per l'app.
9 (livello API 28) e superiori AOT parziale (profilo cloud + profilo di riferimento) Play utilizza i profili di riferimento durante le installazioni delle app per ottimizzare gli 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 oppure problemi per i quali sono in corso sviluppi per le soluzioni alternative:

  • La generazione del profilo di riferimento 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 del profilo di riferimento non è supportata sui dispositivi Firebase Test Lab, inclusi i dispositivi Test Lab gestiti da Gradle (issue #285187547).

  • Per fornire correttamente i profili di riferimento per le librerie, utilizza almeno il plug-in Gradle Baseline Profile 1.2.3 o AGP 8.3 (issue #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 baseline per tutti i tipi di build, ./gradlew app:generateBaselineProfile, genera profili di baseline solo per il tipo di build release. Questo problema è stato risolto in AGP 8.1.

  • I canali di distribuzione delle app non Google Play Store potrebbero non supportare l'utilizzo di Profili di riferimento durante l'installazione. Gli utenti delle app installate tramite questi canali non ne vedranno i vantaggi finché non viene eseguito dexopt in background, probabilmente durante la notte.

  • 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 su alcuni dispositivi, come quelli Huawei, possono interferire con l'installazione del profilo. Per contribuire a garantire l'installazione efficace dei profili, disattiva eventuali ottimizzazioni della batteria nei dispositivi di benchmark.

Risorse aggiuntive