Confrontare le metriche di Scrivi e Visualizza

Jetpack Compose accelera lo sviluppo dell'interfaccia utente e migliora lo sviluppo Android. Tuttavia, tieni presente che l'aggiunta di Compose a un'app esistente può influire su metriche come le dimensioni dell'APK, la compilazione e il rendimento in fase di esecuzione di un'app.

Dimensioni dell'APK e tempi di compilazione

Questa sezione illustra l'impatto sulle dimensioni dell'APK e sui tempi di compilazione esaminando l'app di esempio Sunflower, che mostra le best practice per la migrazione di un'app basata su View a Compose.

Dimensioni dell'APK

L'aggiunta di librerie al progetto ne aumenta le dimensioni dell'APK. I seguenti risultati fanno riferimento all'APK di release minimizzato di ogni progetto con compressione delle risorse e del codice abilitata, utilizzando la modalità completa di R8 e misurati utilizzando APK Analyzer.

Solo visualizzazioni Visualizzazioni e composizione miste Solo composizione
Dimensione download 2252 KB 3034 kB 2966 kB

Al primo inserimento di Compose in Sunflower, le dimensioni dell'APK sono aumentate da 2252 KB a 3034 KB, ovvero un aumento di 782 KB. L'APK generato era costituito dalla compilazione dell'interfaccia utente con una combinazione di Views e Compose. Questo aumento è previsto in quanto sono state aggiunte altre dipendenze a Sunflower.

Al contrario, quando è stata eseguita la migrazione di Sunflower a un'app solo Compose, le dimensioni dell'APK sono diminuite da 3034 KB a 2966 KB, ovvero una riduzione di 68 KB. Questo calo è stato causato dalla rimozione di dipendenze della visualizzazione inutilizzate, come AppCompat e ConstraintLayout.

Ora build

L'aggiunta di Compose aumenta il tempo di compilazione dell'app, poiché il compilatore Compose elabora i composable all'interno dell'app. I seguenti risultati sono stati ottenuti utilizzando lo strumento autonomo gradle-profiler, che esegue una compilazione più volte in modo da ottenere un tempo di compilazione medio per la durata della compilazione di debug di Sunflower:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Solo visualizzazioni Visualizzazioni e composizione miste Solo composizione
Tempo di compilazione medio 299,47 ms 399,09 ms 342,16 ms

Quando è stato aggiunto per la prima volta Compose a Sunflower, il tempo di compilazione medio è aumentato da 299 ms a 399 ms, ovvero un aumento di 100 ms. Questa durata è dovuta al fatto che il compilatore di Compose svolge attività aggiuntive per trasformare il codice di Compose definito nel progetto.

Al contrario, il tempo di compilazione medio è sceso a 342 ms, con una diminuzione di 57 ms, al termine della migrazione di Sunflower a Compose. Questa riduzione può essere attribuita a diversi fattori che riducono collettivamente il tempo di compilazione, come la rimozione del data binding, la migrazione delle dipendenze che utilizzano kapt a KSP e l'aggiornamento di diverse dipendenze alle versioni più recenti.

Riepilogo

L'adozione di Compose aumenterà in modo efficace le dimensioni dell'APK della tua app e anche il rendimento in fase di compilazione dell'app a causa del processo di compilazione del codice di Compose. Tuttavia, questi compromessi devono essere valutati in base ai vantaggi di Compose, in particolare in termini di aumento della produttività degli sviluppatori quando viene adottato Compose. Ad esempio, il team del Play Store ha scoperto che la scrittura dell'interfaccia utente richiede molto meno codice, a volte fino al 50%, aumentando così la produttività e la manutenibilità del codice.

Puoi leggere altri case study in Adottare Compose per Teams.

Rendimento del runtime

Questa sezione tratta gli argomenti relativi alle prestazioni di runtime in Jetpack Compose per aiutarti a capire come Jetpack Compose si confronta con le prestazioni del sistema di visualizzazione e come puoi misurarle.

Ricostruzioni intelligenti

Quando parti dell'interfaccia utente non sono valide, Compose tenta di ricompilare solo le parti che devono essere aggiornate. Scopri di più nella documentazione relativa al ciclo di vita dei composabili e alle fasi di Jetpack Compose.

Profili di riferimento

I profili di riferimento sono un ottimo modo per velocizzare i percorsi utente comuni. L'inclusione di un profilo di riferimento nella tua app può migliorare la velocità di esecuzione del codice di circa il 30% rispetto al primo avvio evitando i passaggi di compilazione just-in-time (JIT) per i percorsi di codice inclusi.

La libreria Jetpack Compose include il proprio profilo di riferimento e ricevi automaticamente queste ottimizzazioni quando utilizzi Compose nella tua app. Tuttavia, queste ottimizzazioni influiscono solo sui percorsi di codice all'interno della libreria Compose, pertanto ti consigliamo di aggiungere un profilo di riferimento alla tua app per coprire i percorsi di codice esterni a Compose.

Confronto con il sistema View

Jetpack Compose offre molti miglioramenti rispetto al sistema View. Questi miglioramenti sono descritti nelle sezioni seguenti.

Tutto estende la visualizzazione

Ogni View che viene disegnato sullo schermo, ad esempio TextView, Button o ImageView, richiede allocazioni di memoria, monitoraggio dello stato esplicito e vari callback per supportare tutti i casi d'uso. Inoltre, il proprietario di View personalizzato deve implementare una logica esplicita per evitare il ricalcolo quando non è necessario, ad esempio per l'elaborazione ripetitiva dei dati.

Jetpack Compose risolve questo problema in diversi modi. Compose non ha oggetti espliciti aggiornati per le visualizzazioni dei disegni. Gli elementi dell'interfaccia utente sono semplici funzioni componibili whose information is written to the composition in a replayable way. In questo modo, si riduce il monitoraggio dello stato esplicito, le allocazioni di memoria e i callback solo ai composabili che richiedono queste funzionalità anziché a tutte le estensioni di un determinato tipo View.

Inoltre, Compose offre ricomposizioni intelligenti, che riproducono il risultato disegnato in precedenza se non devi apportare modifiche.

Più passaggi di layout

I ViewGroup tradizionali hanno un'elevata espressività nelle API di misura e layout che li rendono soggetti a più passaggi di layout. Queste ripetute passate di layout possono causare un lavoro esponenziale se eseguite in punti nidificati specifici nella gerarchia della vista.

Jetpack Compose applica un unico passaggio di layout per tutti i composabili di layout tramite il relativo contratto API. In questo modo, Compose può gestire in modo efficiente gli alberi dell'interfaccia utente complessi. Se sono necessarie più misurazioni, Compose dispone di misurazioni intrinseche.

Visualizza il rendimento all'avvio

Il sistema di visualizzazione deve gonfiare i layout XML quando mostra un determinato layout per la prima volta. Questo costo viene risparmiato in Jetpack Compose poiché i layout sonoscritti in Kotlin e compilati come il resto dell'app.

Benchmark Compose

In Jetpack Compose 1.0 esistono differenze significative tra il rendimento di un'app nelle modalità debug e release. Per tempi rappresentativi, sempre utilizza la build release anziché debug quando esegui il profiling della tua app.

Per controllare il rendimento del codice Jetpack Compose, puoi utilizzare la libreria Jetpack Macrobenchmark. Per scoprire come usarlo con Jetpack Compose, consulta il progetto MacrobenchmarkSample.

Il team di Jetpack Compose utilizza anche Macrobenchmark per rilevare eventuali regressioni che possono verificarsi. Ad esempio, consulta il benchmark per le colonne lazy e la relativa dashboard per monitorare le regressioni.

Installazione del profilo di composizione

Poiché Jetpack Compose è una libreria non in bundle, non sfrutta Zygote, che precarica le classi e gli elementi drawable dell'UI Toolkit del sistema View. Jetpack Compose 1.0 utilizza l'installazione del profilo per le build release. I programmi di installazione del profilo consentono alle app di specificare il codice critico da compilare in anticipo (AOT) al momento dell'installazione. Compose fornisce regole di installazione del profilo che riducono i tempi di avvio e i problemi di aggiornamento nelle app Compose.