Rilevamento di interruzioni nella UI

Android esegue il rendering della UI generando un frame dalla tua app e visualizzandolo sullo schermo. Se la tua app presenta un rendering lento dell'interfaccia utente, il sistema è costretto a saltare i frame. In questo caso, l'utente percepisce uno sfarfallio ricorrente sullo schermo, fenomeno noto come jank.

Quando si verifica un jank, di solito è dovuto a un rallentamento o al blocco di una chiamata asincrona sul thread dell'interfaccia utente (nella maggior parte delle app, è il thread principale). Puoi utilizzare le tracce di sistema per identificare l'origine del problema.

Se utilizzi Jetpack Compose, il modo migliore per analizzare il rendimento del rendering nella traccia è abilitare il tracciamento della composizione. Per informazioni sui problemi di prestazioni comuni di Compose, consulta Prestazioni di Jetpack Compose.

Per le app Compose, segui i passaggi descritti in questa guida quando hai bisogno di una visualizzazione a livello macro della tua app. Le tracce di sistema introdotte qui ti aiutano a identificare i problemi di jank causati da problemi a livello di sistema che bloccano il thread principale, come I/O del disco elevato, garbage collection aggressiva o colli di bottiglia nel rendering della GPU. Utilizza la guida Prestazioni di Jetpack Compose se hai isolato il jank nel livello UI. Questa guida ti aiuta a correggere le inefficienze specifiche di Compose, come ricomposizioni eccessive, lettura dello stato nella fase errata o utilizzo di parametri instabili.

Rilevare i problemi di scattosità su Android 12 e versioni successive

Per i dispositivi che utilizzano Android 12 (livello API 31) o versioni successive, una traccia acquisita viene mostrata nella traccia Frame con jank nel riquadro Display in CPU Profiler.

Per rilevare il jank,

  1. In Android Studio, seleziona Visualizza > Finestre degli strumenti > Profiler o fai clic su Profila nella barra degli strumenti.

    Se richiesto dalla finestra di dialogo Seleziona destinazione di deployment, scegli il dispositivo su cui eseguire il deployment dell'app per la profilazione. Se hai collegato un dispositivo tramite USB ma non lo vedi elencato, assicurati di aver attivato il debug USB.

  2. Fai clic in un punto qualsiasi della sequenza temporale CPU per aprire il CPU Profiler.

  3. Seleziona System Trace (Traccia di sistema) dal menu delle configurazioni in CPU Profiler e fai clic su Registra. Al termine dell'interazione con l'app, fai clic su Interrompi.

  4. Dovresti visualizzare la traccia Frame instabili nella sezione Display. Per impostazione predefinita, il profiler mostra solo i frame con problemi come candidati per l'analisi. All'interno di ogni frame instabile, la parte rossa evidenzia la durata del frame oltre il termine di rendering. Screenshot della traccia Janky frames

  5. Una volta trovato un fotogramma problematico, fai clic su di esso. Se vuoi, puoi premere M per regolare lo zoom e concentrarti sul fotogramma selezionato. Gli eventi pertinenti sono evidenziati in questi thread: il thread principale, RenderThread e GPU completion. Screenshot di Profiler che mostra i frame Janky e
i thread principali

  6. Puoi anche visualizzare tutti i frame o una suddivisione del tempo di rendering attivando le caselle di controllo Tutti i frame e Ciclo di vita, rispettivamente. Screenshot di Profiler come sopra, ma con le caselle di controllo Tutti i frame e Ciclo di vita selezionate

Rilevare i problemi di scattosità su Android 11

Per i dispositivi che utilizzano Android 11 (livello API 30), una traccia acquisita viene mostrata nella sezione Ciclo di vita dei frame nel CPU Profiler.

Sezione Ciclo di vita dei frame con tracce
diverse

La sezione Ciclo di vita del frame contiene il nome del livello e quattro tracce. Ogni traccia rappresenta una fase della pipeline di rendering dei frame. Gli elementi del ciclo di vita del frame sono i seguenti:

  1. Ciclo di vita del frame (nome livello): il titolo della sezione contiene il nome del livello tra parentesi. Un livello è una singola unità di composizione.
  2. Applicazione: questa traccia mostra il tempo trascorso da quando il buffer è stato rimosso dalla coda dall'app a quando è stato reinserito nella coda. Di solito corrisponde agli eventi di traccia in RenderThread.
  3. Attesa GPU: questa traccia mostra per quanto tempo il buffer è stato di proprietà della GPU. È il tempo che intercorre tra l'invio del buffer alla GPU e il momento in cui la GPU termina l'elaborazione del buffer. Ciò non indica che la GPU funzionava solo su questo buffer durante questo periodo. Per informazioni dettagliate su cosa fa la GPU in un determinato periodo di tempo, ti consigliamo di utilizzare Android GPU Inspector.
  4. Composizione: questa traccia mostra il tempo che intercorre tra il momento in cui SurfaceFlinger aggancia il buffer e lo invia per la composizione e il momento in cui il buffer viene inviato al display.
  5. Fotogrammi visualizzati: questa traccia mostra per quanto tempo il fotogramma è rimasto sullo schermo.

La sezione Ciclo di vita del frame illustra come un buffer dei frame si sposta tra le diverse fasi della pipeline di rendering. I fotogrammi sono codificati a colori in base al numero per facilitare il monitoraggio di un fotogramma specifico.

Android Studio mostra anche tutti i frame nella traccia in formato tabella nella scheda Tutti i frame.

Una tabella di tutti i frame nella traccia nella scheda Tutti i frame

Le colonne Frame #, Application, Wait for GPU e Composition rappresentano gli stessi dati delle tracce nella sezione Ciclo di vita dei frame riportata sopra. La colonna Durata frame rappresenta il tempo dall'inizio di Applicazione all'inizio di Frame visualizzati. Questo valore indica essenzialmente il tempo necessario per il rendering end-to-end di un frame.

Puoi ordinare la tabella dei fotogrammi in base a qualsiasi colonna per trovare rapidamente il fotogramma più breve o più lungo. La tabella supporta anche i controlli di impaginazione che ti aiutano a navigare tra centinaia di frame.

Per rilevare e analizzare i problemi di jank su Android 11, segui questi passaggi:

  1. Ordina la tabella Tutti i frame in base alla colonna Applicazione in ordine discendente, in modo che i frame che richiedono più tempo vengano visualizzati per primi.

    Colonna Applicazione ordinata in ordine decrescente

  2. Trova i frame con la durata più lunga e seleziona la riga della tabella. Viene eseguito lo zoom sul frame selezionato nella visualizzazione cronologica a sinistra.

    Visualizzazione cronologica accanto alla tabella dei frame

  3. Cerca i thread pertinenti nelle sezioni Ciclo di vita del frame e Thread.

    Sezioni Ciclo di vita del frame e Thread

Rilevare i problemi di fluidità su Android 10 e versioni precedenti

Per i dispositivi che utilizzano Android 10 (livello API 29) e versioni precedenti, le informazioni sulla pipeline grafica del sistema operativo pertinenti vengono visualizzate in un'unica sezione della traccia di sistema di CPU Profiler chiamata Display.

Finestra dell'interfaccia utente del display

  • Frame: questa sezione mostra gli eventi di traccia del thread dell'interfaccia utente e di RenderThread nella tua app. Gli eventi più lunghi di 16 ms sono colorati di rosso per evidenziare i potenziali frame con problemi di fluidità perché superano il limite di tempo per il rendering a 60 frame al secondo (fps).
  • SurfaceFlinger: questa sezione mostra quando SurfaceFlinger elabora i frame buffer. SurfaceFlinger è un processo di sistema responsabile dell'invio dei buffer al display.
  • VSYNC: questa sezione mostra VSYNC, un segnale che sincronizza la pipeline di visualizzazione. La traccia mostra il segnale VSYNC-app, che indica quando l'app viene avviata troppo tardi. In genere, questo problema si verifica perché il thread dell'interfaccia utente è occupato. Causa uno sfarfallio visibile sullo schermo durante un'animazione e aggiunge una latenza di input aggiuntiva fino al completamento dell'animazione o dello scorrimento. Questo è particolarmente importante per i display con frequenza di aggiornamento elevata, in quanto possono verificarsi più di 60 volte al secondo o a una velocità variabile.
  • BufferQueue: questa sezione mostra il numero di buffer dei frame in coda e in attesa di essere utilizzati da SurfaceFlinger. Per le app di cui è stato eseguito il deployment su dispositivi con Android 9 (livello API 28) o versioni successive, questa traccia mostra il conteggio dei buffer della BufferQueue della superficie dell'app (0, 1 o 2). BufferQueue può aiutarti a comprendere lo stato dei buffer delle immagini mentre si spostano tra i componenti grafici di Android. Ad esempio, un valore di 2 indica che l'app è attualmente a tripla memorizzazione nel buffer, il che comporta una latenza di input aggiuntiva.

La sezione Display fornisce segnali utili per rilevare potenziali problemi di jank, ad esempio quando il thread dell'interfaccia utente o RenderThread impiega più di 16 ms. Per esaminare i dettagli esatti della causa del jank, puoi analizzare la sezione Thread, che mostra i thread pertinenti al rendering dell'interfaccia utente.

La sezione Thread in
Display

Nella figura sopra, la sezione Thread mostra il thread dell'interfaccia utente (java.com.google.samples.apps.iosched), RenderThread e il thread GPU completion. Questi sono i thread pertinenti per il rendering dell'interfaccia utente e potrebbero contribuire a problemi di scattosità.

Per rilevare i problemi di scattosità su Android 10 o versioni precedenti:

  1. Guarda la traccia Frame in Display. I frame rossi sono candidati per l'indagine.

    La sezione Frame in Display

  2. Una volta trovato un frame potenzialmente problematico, ingrandiscilo premendo W o scorrendo la rotellina del mouse mentre tieni premuto Ctrl (Cmd su macOS). Continua ad aumentare lo zoom finché non inizi a visualizzare gli eventi di traccia nel thread dell'interfaccia utente e RenderThread.

    Traccia gli eventi nel thread dell'interfaccia utente e in RenderThread

    Nella figura sopra, Choreographer#doFrame mostra quando il thread dell'interfaccia utente chiama Choreographer per coordinare l'animazione, il layout della visualizzazione, il disegno delle immagini e i processi correlati. DrawFrames mostra quando i moduli RenderThread e i comandi di disegno effettivi vengono inviati alla GPU.

  3. Se vedi un evento di traccia particolarmente lungo nel thread principale, esegui lo zoom avanti per vedere quale componente UI o funzione componibile sta ritardando il frame.

Indagine avanzata con Perfetto

L'attività di profilazione della traccia di sistema di Android Studio è basata su Perfetto. Se hai a che fare con problemi di rendering complessi e hai bisogno di query SQL personalizzate o di una navigazione avanzata nella sequenza temporale, puoi eseguire l'analisi delle tracce al di fuori dell'IDE.

Esporta la traccia di sistema da Android Studio facendo clic sull'icona Esporta traccia nel riquadro Profiler, quindi trascina il file risultante nell'interfaccia utente Perfetto basata sul web. In questo modo, viene fornito un ambiente dedicato per l'analisi delle prestazioni a livello di sistema. Per informazioni su come interpretare i dettagli della pipeline grafica del sistema operativo, come VSYNC, SurfaceFlinger e le tracce della sequenza temporale dei frame, consulta la documentazione ufficiale di Perfetto.

Scopri di più

Per saperne di più su come ridurre i problemi di scattosità, consulta Fonti comuni di scattosità.