Winscope è uno strumento web che consente agli utenti di registrare, riprodurre e analizzare gli stati di diversi servizi di sistema durante e dopo le animazioni e le transizioni. Winscope registra tutti gli stati pertinenti dei servizi di sistema in un file di traccia. Utilizzando l'interfaccia utente di Winscope con il file di traccia, puoi ispezionare lo stato di questi servizi per ogni frame dell'animazione, con o senza una registrazione dello schermo, riproducendo, esaminando e eseguendo il debug delle transizioni.
Tracce supportate
Winscope consente di raccogliere e rappresentare visivamente varie tracce o sequenze di stati dei servizi di sistema. Puoi configurare queste tracce in base a casi d'uso specifici, che vanno da un overhead ridotto a una grande quantità di dettagli. Le seguenti tracce sono supportate da Winscope:
- EventLog: raccogli il record dell'evento di diagnostica del sistema utilizzando
EventLog
. In Winscope queste informazioni vengono utilizzate solo per identificare e visualizzare le marcature CUJ. - IME: traccia gli eventi della pipeline Input Method Editor (IME), inclusi IMS, IMMS e IME Client.
- Input:traccia gli eventi di input da varie parti della pipeline di eventi di input.
- ProtoLog: raccoglie i messaggi ProtoLog dai servizi di sistema e il codice dei servizi di sistema in esecuzione nelle procedure client.
- Registrazione dello schermo:raccogli una registrazione dello schermo insieme alle tracce.
- Transizioni della shell:registra i dettagli di sistema delle transizioni di finestre e attività.
- SurfaceFlinger: raccogli le tracce di SurfaceFlinger contenenti informazioni sulle superfici (livelli), ad esempio posizione, buffer e composizione.
- Transazioni: traccia l'insieme di modifiche atomiche ricevute da SurfaceFlinger utilizzando
SurfaceControl
per la composizione. - ViewCapture: acquisisci una serie di proprietà di tutte le visualizzazioni delle finestre di sistema che supportano ViewCapture, come l'interfaccia utente di sistema e Avvio.
- Window Manager: traccia gli stati di Window Manager contenenti dettagli relativi alle finestre, inclusi eventi di input e di attribuzione dell'attenzione, orientamento dello schermo, transizioni, animazioni, posizionamento e trasformazioni.
Dump supportati
Winscope può raccogliere e visualizzare i dump dello stato, ovvero snapshot dello stato del dispositivo acquisiti in momenti specifici definiti dall'utente. A differenza delle tracce, che vengono raccolte continuamente durante l'utilizzo del dispositivo e possono influire sulle prestazioni, i dump vengono acquisiti solo in questi momenti definiti dall'utente, garantendo che le prestazioni e la completezza non siano compromesse. Ciò consente un'analisi più mirata ed efficiente dello stato del dispositivo in momenti specifici. I seguenti dump sono supportati da Winscope:
- Window Manager:esegui il dump di un singolo stato di Window Manager.
- SurfaceFlinger: esegui il dump di un singolo snapshot di SurfaceFlinger.
- Screenshot:acquisisci uno screenshot insieme ai dump.
Risorse
Per informazioni su come creare e eseguire Winscope, consulta Eseguire Winscope.
Consulta la sezione Acquisire tracce per informazioni sulla raccolta delle tracce.
Consulta Carica tracce per informazioni su come caricare le tracce utilizzando l'interfaccia utente web di Winscope.
Per informazioni sull'analisi delle tracce, consulta Analizzare le tracce.
Esempi
L'esempio seguente descrive come eseguire il debug di un errore del test di sfarfallio e di un bug segnalato dall'utente.
Test di sfarfallio non riuscito
Questo esempio mostra come utilizzare Winscope per eseguire il debug di un errore del test di sfarfallio.
Esamina l'errore del test
Segui questi passaggi per determinare il tipo di problema ed esaminare il messaggio di errore del test.
Determina il tipo di problema esaminando il nome del test e della classe.
Nome del test e del corso:
FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
Tipo di problema:
Il CUJ fa riferimento all'avvio di un'app da una notifica nella schermata di blocco (
OpenAppFromLockscreenNotificationColdTest
).Il test si aspetta che l'app diventi visibile (
#appLayerBecomesVisible
).
Esamina il messaggio di errore del test, che fornisce informazioni complete sull'errore, tra cui:
- Un confronto tra il risultato previsto e il risultato visibile effettivo
- Timestamp per individuare con precisione il momento in cui si è verificato l'errore
- Il nome dell'elemento o del file associato all'errore
- Ulteriori informazioni contestuali pertinenti per comprendere e eseguire il debug dell'errore
android.tools.flicker.subject.exceptions.IncorrectVisibilityException: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# should be visible Where? Timestamp(UNIX=2024-05-10T11:04:14.227572545(1715339054227572545ns), UPTIME=37m21s184ms79178ns(2241184079178ns), ELAPSED=0ns) What? Expected: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# Actual: [e636ecd com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3457: Buffer is empty, Visible region calculated by Composition Engine is empty, com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458: Visible region calculated by Composition Engine is empty] Other information Artifact: FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.zip Check the test run artifacts for trace files at android.tools.flicker.subject.layers.LayerTraceEntrySubject.isVisible(LayerTraceEntrySubject.kt:187) at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:151) at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:150) at android.tools.flicker.assertions.NamedAssertion.invoke(NamedAssertion.kt:32) at android.tools.flicker.assertions.CompoundAssertion.invoke(CompoundAssertion.kt:42) at android.tools.flicker.assertions.AssertionsChecker.test(AssertionsChecker.kt:79) at android.tools.flicker.subject.FlickerTraceSubject.forAllEntries(FlickerTraceSubject.kt:59) at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:46) at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:43) at android.tools.flicker.assertions.AssertionDataImpl.checkAssertion(AssertionDataImpl.kt:33) at android.tools.flicker.assertions.ReaderAssertionRunner.doRunAssertion(ReaderAssertionRunner.kt:35) at android.tools.flicker.assertions.ReaderAssertionRunner.runAssertion(ReaderAssertionRunner.kt:29) at android.tools.flicker.assertions.BaseAssertionRunner.runAssertion(BaseAssertionRunner.kt:36) at android.tools.flicker.legacy.LegacyFlickerTest.doProcess(LegacyFlickerTest.kt:59) at android.tools.flicker.assertions.BaseFlickerTest.assertLayers(BaseFlickerTest.kt:89) at com.android.server.wm.flicker.notification.OpenAppTransition.appLayerBecomesVisible_coldStart(OpenAppTransition.kt:51) at com.android.server.wm.flicker.notification.OpenAppFromNotificationColdTest.appLayerBecomesVisible(OpenAppFromNotificationColdTest.kt:64)
Questo esempio di output indica quanto segue:
Il problema si verifica alle ore
2024-05-10T11:04:14.227572545
.NotificationActivity
dovrebbe essere visibile, ma non lo è.Il nome del file dell'elemento che contiene le tracce per il debug è
FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV
.
Debug
Per determinare la causa del tremolio:
Scarica i file di traccia e caricali in Winscope. Winscope si apre con SurfaceFlinger selezionato automaticamente:
Figura 1. Pagina di destinazione di Winscope con visualizzazione di SurfaceFlinger.
Vai al timestamp in cui si verifica il problema copiando e incollando il timestamp dal messaggio di eccezione nel campo del timestamp. Puoi copiare il timestamp in formato leggibile da un essere umano (
2024-05-10T11:04:14.227572545
) e incollarlo nel primo campo oppure copiare il timestamp in nanosecondi (1715339054227572545ns
) e incollarlo nel secondo campo.Figura 2. Finestra di dialogo Timestamp.
Premi il tasto Freccia sinistra per passare al frame precedente. In questo stato, l'app NotificationActivity viene visualizzata correttamente nel video e sono visibili sia le piattaforme dell'app sia quelle della schermata iniziale, indicate dai rettangoli verdi nella visualizzazione 3D e dal chip V sugli elementi della gerarchia.
I nomi delle piattaforme dell'app e della schermata iniziale sono:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458` Splash Screen com.android.server.wm.flicker.testapp#3453
Ciò indica che l'app stava avviandosi quando lo schermo è diventato nero e che questo evento si sta verificando durante l'avvio dell'app, poiché la schermata iniziale è ancora visibile:
Figura 3. All'avvio dell'app.
Premi il tasto Freccia destra per tornare al fotogramma successivo, in cui si verifica il tremolio. Nella visualizzazione dei rettangoli, sullo schermo viene visualizzato
NotificationShade
anziché l'app. In questo frame vengono mostrate le seguenti piattaforme:- Decorazioni sullo schermo (sopra e sotto)
- Barra di navigazione
Posizione del cursore (dalla registrazione dello schermo)
Figura 4. Attività di sfarfallio.
Seleziona l'attività dell'app nella visualizzazione gerarchica. Se non riesci a trovarla, disattiva l'opzione Mostra solo V. Poi, controlla la visualizzazione delle proprietà.
Il nome dell'interfaccia dell'app è:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
Figura 5. Proprietà dell'app.
Sebbene l'attività dell'app sia impostata su visibile e opaca, la superficie non viene visualizzata a causa di un errore
Invisible due to: null visible region
. Questo accade perché durante la composizione è stata posizionata un'altra superficie opaca. Questa ipotesi deriva dal fatto che il rettangoloNotificationShade
si trova davanti al rettangoloNotificationActivity
nella vista 3D e che ilNotificationShade
visibile (verde) potrebbe essere il livello scelto.Per convalidare questa ipotesi, seleziona la
NotificationShade
superficie visibile nel frame corrente e controllane le proprietà. I flag sono impostati suOPAQUE|ENABLE_BACKPRESSURE (0x102)
. Il nome della superficieNotificationShade
èNotificationShade#3447
. Quindi, premi la Freccia sinistra per tornare al frame precedente (prima del tremolio) e controlla di nuovo le proprietà della superficieNotificationShade
. Tieni presente che invece di essereOPAQUE
, la superficie ha solo il flagENABLE_BACKPRESSURE (0x100)
. Ciò conferma cheNotificationShade
diventa opaco prima del completamento del lancio dell'app. PoichéNotificationShade
è davanti aNotificationActivity
, l'app non viene visualizzata. Il carattereNotificationShade
è nero, quindi lo schermo diventa brevemente nero, causando il tremolio.Individua nel codice il motivo per cui
NotificationShade
diventa opaco troppo presto.
Bug segnalato dall'utente
Il debug dei bug segnalati dagli utenti può essere complicato perché spesso mancano informazioni dettagliate. A differenza degli errori del test di sfarfallio, che forniscono timestamp specifici, dettagli degli elementi e registrazioni dello schermo, i bug segnalati dagli utenti in genere includono solo una breve descrizione del problema.
Nel nostro caso, le uniche informazioni fornite sono il titolo Lo schermo sfarfallava quando ho riaperto l'app dallo schermo diviso e un timestamp approssimativo di 18 apr 2024 15:51 GMT-04:00.
Per eseguire il debug di un bug segnalato da un utente:
Carica il file di traccia in Winscope. Winscope si apre con SurfaceFlinger selezionato automaticamente.
Figura 6. Pagina di destinazione di Winscope con visualizzazione di SurfaceFlinger.
Vai al timestamp approssimativo segnalato dall'utente, in questo caso
3:50 PM GMT-04:00
, inserendo15:50:00
nel campo del timestamp leggibile da una persona.Figura 7. Finestra di dialogo Timestamp.
Utilizza la visualizzazione dei rettangoli per identificare ciò che è stato disegnato sullo schermo. Per una migliore visualizzazione, utilizza il cursore Rotazione per modificare la prospettiva dei rettangoli. Se selezioni Mostra solo V e Piatto nella visualizzazione Gerarchia, lo sfondo, l'overlay decorativo della schermata, la modalità letterbox, le piattaforme di Avvio app, Contatti e Telefono sono visibili.
I nomi dei pacchetti sono:
Avvio app:
com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#40602
Contatti:
com.google.android.contacts/com.android.contacts.activities.PeopleActivity#40565
Telefono:
com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564
Oltre alle aree visibili (rettangoli verdi), viene visualizzato un rettangolo grigio, che rappresenta l'area di visualizzazione, denominato Display sconosciuto. Per migliorare la visibilità, fai clic sul pulsante (
) accanto alla superficie
ScreenDecorHwcOverlay#64
per nascondere il corrispondente quadrato e rivelare le superfici dietro. Rimuoviamo l'overlay per l'analisi perché non è visibile all'utente e non verrebbe segnalato come immagine in movimento.Figura 8. Report utente.
Dopo aver identificato le piattaforme coinvolte nella visualizzazione dello schermo diviso, utilizza la traccia Transizioni per esaminare le varie azioni dell'utente e trovare il tremolio. Fai clic sulla scheda Transizioni in Winscope per visualizzare l'elenco delle transizioni riprodotte:
Figura 9. Transizioni.
La transizione riprodotta durante questo frame è evidenziata in blu. In questo caso, gli indicatori di transizione includono
TRANSIT_FLAG_IS_RECENTS
, che indica che l'utente sta entrando nella schermata Recenti.Fai clic sul link nella colonna Dispatch Time (in questo caso
2024-04-18, 15:50:57.205
) per passare a quel momento e verificare i rettangoli nella scheda Surface Flinger. Verifica la correttezza dello stato del dispositivo durante la transizione procedendo con la transizione con il tasto freccia corretto e osservando i rettangoli.Avvio viene visualizzato alle 15:50:57,278, ma l'animazione non si avvia. Lo sfondo è già visibile perché non viene visualizzato nulla tra le app con schermo diviso (divisore). In un frame precedente (15:50:57.212), lo sfondo non è visibile e viene mostrato il divisore, ovvero l'aspetto della schermata divisa quando non è in animazione.
Figura 10. Schermata prima dell'evento di sfarfallio.
Per controllare la transizione successiva, fai clic direttamente sulla sequenza temporale. Gli stati di SurfaceFlinger sono rappresentati da una riga di blocchi azzurri. Le transizioni sono rappresentate da una riga di blocchi rosa.
Figura 11. Fine della prima transizione.
Fai clic sulla riga SurfaceFlinger nella posizione iniziale della transizione successiva. Nella figura 11, la posizione verticale del cursore è indicada dalla linea blu sottile. Lo sfondo azzurro della riga SurfaceFlinger indica la sua posizione orizzontale. Esplora la transizione con il tasto Freccia destra per verificare se si verifica un tremolio. Verifica che il dispositivo sia corretto per questa transizione.
Ignora la transizione successiva perché la sua durata è molto breve, quindi è improbabile che contenga sfarfallio. Fai invece clic sulla sequenza temporale nella riga SurfaceFlinger nella posizione iniziale della transizione più lunga successiva, come indicato dal cursore nell'immagine seguente.
Figura 12. Fine della seconda transizione.
Durante questa transizione, a
15:51:13.239
, osserva che i livelliSplash Screen
per entrambe le app, i contatti e la tastiera, si trovano sullo stesso lato dello schermo:Figura 13. Schermate iniziali.
Indica quale app è sul lato sbagliato. Aggiungi un preferito alla tua posizione corrente facendo clic sull'icona a forma di bandierina accanto al campo di immissione ns per tornare a questo frame in un secondo momento.
Figura 14. Aggiungi preferito.
Vai a un frame alla fine della transizione facendo clic direttamente sulla sequenza temporale, ad esempio su
15:51:13.859
. Ora le due app sono nella posizione finale, con il tastierino a sinistra e i contatti a destra:Figura 15. Schermo diviso finale.
Fai clic sull'indicatore del preferito nella sequenza temporale per tornare al fotogramma con il tremolio.
Figura 16. Segnalibro della cronologia.
Entrambe le app sono a destra, il che indica che il tastierino è nella posizione sbagliata.
Fai clic sulla schermata iniziale della tastiera per visualizzarne le proprietà. Esamina in modo specifico le proprietà di trasformazione nella visualizzazione selezionata Proprietà.
Figura 17. Trasforma le proprietà.
La trasformazione calcolata viene applicata a questa superficie, ma non impostata come questo livello. Le colonne calcolate e richieste hanno valori diversi, indicando che la trasformazione viene ereditata da una superficie principale.
Deseleziona Flat nella visualizzazione gerarchia per mostrare l'intera struttura ad albero della gerarchia, e vai ai nodi principali dell'interfaccia dell'app finché le trasformazioni Calcolata e Richiesta non sono uguali, mostrando la trasformazione richiesta sull'interfaccia
Surface(name=Task=7934)/@0x1941191_transition-leash#40670
.Verifica quando è stata impostata per la prima volta la trasformazione e su quale valore. Comprimi le proprietà selezionate facendo clic sull'icona accanto al titolo:
Figura 18. Comprimi le proprietà selezionate.
Seleziona Mostra diff nella visualizzazione Proto Dump per evidenziare le proprietà che vengono modificate in questo frame. Digita
transform
nel campo di ricerca di testo per filtrare le proprietà:Figura 19. Mostra il confronto.
La trasformazione è impostata da
IDENTITY
aSCALE|TRANSLATE|ROT_270
in questo frame pertransition-leash
.Queste informazioni mostrano che il tremolio si è verificato quando la trasformazione è stata applicata al guinzaglio dell'animazione dell'app della schermata divisa della tastiera.
Figura 20. Identificazione del tremolio.
Identifica nel codice il motivo per cui questa trasformazione è impostata sul guinzaglio di transizione dello schermo diviso.