Tracciare le transizioni delle finestre con Winscope

Winscope è uno strumento web che consente agli utenti di registrare, riprodurre e analizzare gli stati di diversi servizi di sistema durante e dopo animazioni e transizioni. Winscope registra tutti gli stati del servizio di sistema pertinenti 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, passando da un passaggio all'altro e eseguendo il debug delle transizioni.

Di seguito sono riportati i servizi di sistema che producono tracce caricabili in Winscope:

  • SurfaceFlinger
  • WindowManager
  • WMShell
  • IME
  • Avvio app

Esegui il visualizzatore tracce Winscope

Il tracciamento di Winscope fa parte dei servizi della piattaforma. Questa sezione illustra i passaggi necessari per scaricare, creare ed eseguire il visualizzatore tracce Winscope.

Procedi nel seguente modo per configurare il PC per l'esecuzione del localizzatore Winscope:

  1. Scarica il codice sorgente Android.
  2. Vai alla cartella Winscope:

    cd development/tools/winscope
    
  3. Installa le dipendenze utilizzando:

    npm install
    

    Per visualizzare un elenco dei comandi disponibili, esegui: npm run

  4. Crea tutti i target di produzione e test utilizzando:

    npm run build:prod
    
  5. Esegui Winscope utilizzando:

    npm run start
    

Acquisisci tracce

Puoi acquisire le tracce sul dispositivo tramite Winscope o tramite i comandi di Android Debug Bridge (adb).

Acquisisci tracce sul dispositivo

Acquisisci le tracce sul dispositivo per raccogliere i dati quando segnali bug per problemi di animazione. Con questo metodo vengono registrate tutte le tracce dell'interfaccia utente, poiché la configurazione non può essere personalizzata.

Dal tuo dispositivo Android:

  1. Attiva le Opzioni sviluppatore.
  2. Seleziona Tracciamento del sistema in Opzioni sviluppatore.
  3. Attiva Raccogli tracce Winscope.
  4. In Varie:
    1. Attiva Allega le registrazioni alle segnalazioni di bug.
    2. Attiva Mostra riquadro Impostazioni rapide.
  5. Vai alla posizione in cui devi riprodurre il bug.
  6. Per avviare la registrazione, apri le Impostazioni rapide e seleziona Registra traccia:

    impostazione_rapida_winscope

    Figura 1. Menu Impostazioni rapide con Registra traccia.

  7. Esegui solo i passaggi necessari per riprodurre il bug.

  8. Per interrompere l'acquisizione, apri le Impostazioni rapide e seleziona Interrompi tracciamento.

  9. Condividi il log acquisito utilizzando una delle opzioni elencate, ad esempio Gmail, Drive o BetterBug.

Acquisisci le tracce tramite Winscope

Puoi acquisire tracce utilizzando Winscope per lo sviluppo e il debug locali. Winscope utilizza adb, che supporta la connessione del dispositivo tramite USB o Wi-Fi.

Su Winscope:

  1. Nella schermata Raccogli tracce, fai clic su ADB Proxy:

    acquisizione_traces_winscope

    Figura 2. Acquisisci le tracce su Winscope.

  2. Avvia il proxy Winscope ADB Connect per acquisire tracce direttamente dal browser.

  3. Esegui il comando:

    python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
    
  4. Per avviare l'acquisizione, nella schermata Raccogli tracce seleziona i target e la configurazione e fai clic su Avvia traccia:

    collect_traces_winscope

    Figura 3. Raccogli le tracce su Winscope.

  5. Per interrompere l'acquisizione, fai clic su Termina traccia:

    end_trace_winscope

    Figura 4. Termina traccia su Winscope.

Quando lo strumento carica le tracce nell'interfaccia utente di Winscope, sullo schermo vengono visualizzati i messaggi Recupero e Analisi file proto.

Genera il dump dello stato utilizzando Winscope

Per eseguire un dump dello stato utilizzando Winscope, nella schermata Raccogli tracce seleziona la scheda Dump, quindi fai clic su Stato di dump:

dump-winscope

Figura 5. Esegui il dump dello stato su Winscope.

Acquisire tracce tramite i comandi adb

Esegui adb root prima di eseguire i comandi adb shell per ciascuna delle seguenti tracce. Al termine della traccia, i file di traccia sono disponibili in /data/misc/wmtrace. Per copiare un file o una directory e le relative sottodirectory da un dispositivo, consulta Copiare file da e verso un dispositivo. Per ulteriori informazioni, consulta adb.

Tracce WindowManager

Per acquisire le tracce di WindowManager:

  • Abilita traccia:

    adb shell wm tracing start
    
  • Per disattivare la traccia:

    adb shell wm tracing stop
    
  • Salva i dati di logging nel file durante l'esecuzione di un'acquisizione della traccia:

    adb shell wm tracing save-for-bugreport
    
  • Registra la traccia una volta per frame:

    adb shell wm tracing frame
    
  • Registra ogni transazione:

    adb shell wm tracing transaction
    
  • Imposta la dimensione massima del log (in kB):

    adb shell wm tracing size
    
  • Stato traccia di stampa:

    adb shell wm tracing status
    
  • Imposta il livello di log su critical (solo finestre visibili con informazioni ridotte), trim (tutte le finestre con informazioni ridotte) o all (tutte le finestre e le informazioni):

    adb shell wm tracing level
    

ProtoLog

I seguenti comandi vengono utilizzati per il sistema ProtoLog.

Nel processo system_server:

  • Avvia ProtoLog:

    adb shell cmd window logging start
    
  • Arresta ProtoLog:

    adb shell cmd window logging stop
    
  • Abilita ProtoLog per determinati gruppi di log:

    adb shell cmd window logging enable [group...]
    
  • Disattiva ProtoLog per determinati gruppi di log:

    adb shell cmd window logging disable [group...]
    
  • Attiva il logging di Logcat per determinati gruppi di log:

    adb shell cmd window logging enable-text [group...]
    
  • Disabilita il logging di Logcat per i gruppi di log specificati:

    adb shell cmd window logging disable-text [group...]
    

In WMShell:

  • Avvia ProtoLog:

    adb shell dumpsys activity service SystemUIService WMShell
    

Tracciamento transizioni

I seguenti comandi vengono utilizzati per il monitoraggio delle transizioni:

Nel processo system_server:

  • Avvia una traccia:

    adb shell cmd window shell tracing start
    
  • Interrompere una traccia:

    adb shell cmd window shell tracing stop
    
  • Avvia una traccia in WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
    
  • Interrompi una traccia in WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
    

Input Method Editor

Per il tracciamento IME (Input Method Editor), vengono utilizzati i seguenti comandi:

  • Avvia il monitoraggio IME per i client di metodi di inserimento (IM), il servizio di metodi di inserimento (IMS) e il servizio di gestione dei metodi di inserimento (IMMS):

    adb shell ime tracing start
    
  • Avvia il monitoraggio dei client IME, IMS e IMMS:

    adb shell ime tracing stop
    

Livelli SurfaceFlinger

Il monitoraggio del livello SurfaceFlinger utilizza la traccia Perfetto per l'acquisizione. Per informazioni sulla configurazione, consulta Configurazione di traccia.

Consulta il seguente esempio di configurazione per il monitoraggio del livello SurfaceFlinger:

unique_session_name: "surfaceflinger_layers_active"
buffers: {
    size_kb: 63488
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.layers"
        surfaceflinger_layers_config: {
            mode: MODE_ACTIVE
            trace_flags: TRACE_FLAG_INPUT
            trace_flags: TRACE_FLAG_COMPOSITION
            trace_flags: TRACE_FLAG_HWC
            trace_flags: TRACE_FLAG_BUFFERS
            trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
        }
    }
}

Consulta il seguente comando di esempio per generare il monitoraggio per i livelli SurfaceFlinger:

adb shell -t perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Transazioni SurfaceFlinger

Il monitoraggio delle transazioni di SurfaceFlinger utilizza la traccia Perfetto per l'acquisizione. Per informazioni sulla configurazione, consulta Configurazione della traccia.

Guarda il seguente esempio di configurazione di Perfetto per il monitoraggio attivo di SurfaceFlinger:

unique_session_name: "surfaceflinger_transactions_active"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_ACTIVE
        }
    }
}
write_into_file: true
file_write_period_ms: 100

Vedi l'esempio di configurazione Perfetto per il tracciamento continuo di SurfaceFlinger:

unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_CONTINUOUS
        }
    }
}

Vedi il seguente comando di esempio per generare il tracciamento per le transazioni SurfaceFlinger:

    adb shell perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Generare il dump dello stato utilizzando adb

Winscope legge un'istantanea degli stati di WindowManager e SurfaceFlinger dalle segnalazioni di bug. Le segnalazioni di bug memorizzano gli stati come file proto separati all'interno della proto cartella. Per generare i dump dello stato utilizzando adb, esegui i seguenti comandi.

Per WindowManager:

adb exec-out dumpsys window --proto > window_dump.winscope

Per SurfaceFlinger:

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

Analizzare le tracce

Per eseguire il debug di stati transitori e non validi che causano problemi di animazione, Winscope aggrega diversi file di traccia, fornisce ricerca e visualizzazione su frame e schemi temporali e presenta i messaggi protobuf in modo coerente. L'analisi delle tracce in Winscope consente di identificare esattamente lo strato, il frame e lo stato in cui si è verificato il bug.

Utilizzare Winscope

Dopo aver acquisito tracce, analizzale su Winscope:

  1. Carica le tracce salvate utilizzando il riquadro a destra. Puoi rimuovere le tracce caricate o caricarne altre.

    upload_traces_winscope

    Figura 6. Carica le tracce su Winscope.

  2. Fai clic su Visualizza tracce per visualizzare le tracce caricate. Le schede per ogni traccia vengono visualizzate nel riquadro superiore della finestra. Se il file caricato contiene le tracce pertinenti, sullo schermo viene sovrapposta una visualizzazione mobile della traccia della registrazione dello schermo.

    visualizza_traces_winscope

    Figura 7. Visualizza tracce su Winscope.

    Utilizza l'interfaccia utente nel riquadro più alto della finestra per rinominare edit_name e scaricare la traccia caricata download_trace o per caricarne una nuova.

  3. Scorri le tracce nel tempo utilizzando lo strumento di scorrimento temporale nel riquadro in basso della finestra. Per una navigazione più dettagliata nel tempo, utilizza le seguenti funzionalità, come mostrato in Figura 8:

    • Per passare a un'ora o a un'occorrenza specifica, utilizza il cursore (cursore della cronologia) o le frecce tempo_freccia_sinistra sinistra freccia_destra_ora nella casella di visualizzazione dell'ora (nell'angolo in basso a sinistra) oppure le frecce sinistra e destra sulla tastiera.
    • Per visualizzare le tracce selezionate con codice a colori sulla cronologia, utilizza il menu a discesa (a sinistra del cursore del tempo). Per impostazione predefinita, nella cronologia vengono visualizzate le ultime tre tracce visualizzate utilizzando le schede delle tracce.
    • Per una visualizzazione granulare di tutte le tracce caricate, utilizza lo strumento Aumenta zoom_in_time o Diminuisci lo zoom tempo_zoom_out (sotto il cursore temporale) oppure scorri sulla tastiera. Usa il pulsante di ripristino per ripristinare il livello di zoom.
    • Per una visualizzazione espansa della distribuzione delle tracce nel tempo, fai clic sulla Freccia su arrow_up_time (nell'angolo in basso a destra).

    time_nav_winscope

    Figura 8. Navigazione nel tempo su Winscope.

    Nella visualizzazione espansa (Figura 9), seleziona e aumenta lo zoom su intervalli di tempo specifici per un'ispezione più accurata:

    espandi_tempo_winscope

    Figura 9. Sequenza temporale espansa in Winscope.

  4. Per esaminare le tracce, puoi visualizzare lo stato del dispositivo con la registrazione dello schermo. Per esaminare una determinata traccia, fai clic sulla scheda della traccia pertinente nel riquadro superiore dello strumento.

    • Per la traccia Surface Flinger, tre riquadri mostrano visualizzazioni diverse della traccia in un determinato periodo di tempo, come mostrato nella Figura 10: sf_trace

      Figura 10. Traccia Surface Flinger su Winscope.

      • Visualizzazione Livelli: una visualizzazione 3D dei livelli in overlay rettangolari. I seguenti elementi dell'interfaccia utente modificano i rettangoli per visualizzare gli elementi grafici in termini di posizione, dimensione, trasformazione e ordine z:

        • Il cursore Rotazione (in alto a sinistra nella visualizzazione Livelli) ruota i rettangoli con livelli per visualizzarli agli angoli scelti.
        • Il cursore Spaziatura (in alto a destra nella visualizzazione Livelli) regola la spaziatura tra i livelli per creare la vista composita scelta.
        • Gli strumenti zoom (in alto a destra nella visualizzazione Livelli) aumentano lo zoom zoom_in_time e diminuisci lo zoom zoom_out_time dei livelli per un'ispezione migliore.
        • Il pulsante di ripristino reset_sf (in alto a destra nella visualizzazione Livelli) ripristina le impostazioni della fotocamera alla vista originale.
        • Trascina i rettangoli per facilitare lo zoom.
      • Visualizzazione Gerarchia: una gerarchia completa dei livelli.

        • Solo visibili (in alto a destra nella visualizzazione Gerarchia), se selezionato, nasconde i livelli invisibili dalla gerarchia per aiutare a visualizzare gli elementi sullo schermo.
        • L'opzione Piatto (in alto a destra nella visualizzazione Gerarchia), se selezionata, mostra la gerarchia come elenco bidimensionale di livelli.
        • L'opzione Mostra il confronto (in alto a sinistra nella visualizzazione Gerarchia) è selezionata solo quando c'è una transizione di stato. Quando questa opzione è selezionata, lo strumento confronta lo stato attuale con quello precedente. Un nuovo elemento viene evidenziato in verde, un elemento eliminato viene evidenziato in rosso e un elemento modificato viene evidenziato in blu.
      • Visualizzazione Proprietà: proprietà del livello selezionato. Il riquadro superiore della vista Proprietà contiene informazioni relative solo alle proprietà chiave, come Visibilità, Geometry e Buffer. Il riquadro inferiore della vista Proprietà contiene un proto dump di tutte le proprietà.

        • La casella di controllo Mostra differenze (in alto a sinistra nella visualizzazione Proprietà) si comporta come nella visualizzazione Gerarchia.
        • L'opzione Mostra predefiniti (in alto a sinistra nella visualizzazione Proprietà) mostra i valori di protocollo predefiniti nel dump protocollo. Per impostazione predefinita, questi valori non sono elencati nel dump di Proto. I valori predefiniti del protocollo vengono presi dalla definizione del campo proto. Se in un campo proto non è impostato un valore predefinito non null, i valori predefiniti visualizzati sono:
          • Stringhe: null
          • Numeri: 0
          • Valori booleani: false
          • Oggetti: null

      La selezione tra le tre visualizzazioni e la registrazione dello schermo viene sincronizzata, ovvero tutte le tracce vengono aggiornate in modo sincrono quando passi a un altro momento. Per visualizzare le proprietà di un livello, selezionalo facendo clic sulla relativa opzione nella visualizzazione Gerarchia o sul rispettivo rettangolo nella visualizzazione Proprietà. Un rettangolo viola indica che a questo livello è associata una traccia della visualizzazione. Facendo doppio clic su un livello viola, l'interfaccia utente passa alla scheda della traccia di visualizzazione pertinente.

    • Per la traccia Gestore finestre, tre riquadri mostrano visualizzazioni diverse della traccia in un determinato periodo di tempo, come mostrato nella Figura 11:

      • Visualizzazione Finestre: una visualizzazione 3D dei livelli.
      • Visualizzazione Gerarchia: una gerarchia completa dei livelli.
      • La vista Proprietà contiene un dump di proto di tutte le proprietà.

      La selezione tra le tre visualizzazioni e la registrazione dello schermo è sincronizzata, ovvero tutte le tracce vengono aggiornate in modo sincrono quando navighi in un momento diverso.

      wm_trace

      Figura 11. Traccia di Window Manager su Winscope.

    • Per le tracce Transactions, le transazioni tra Surface Flinger e Window Manager sono presentate in formato tabella, in cui è possibile eseguire ricerche in base agli ID, al tipo e al testo visualizzati, insieme a una visualizzazione delle proprietà che mostra il dump di proto. La selezione tra le due visualizzazioni e la registrazione dello schermo è sincronizzata:

      transaction_trace

      Figura 12. Traccia delle transazioni su Winscope.

    • Per le tracce ProtoLog, le informazioni vengono presentate in un formato tabella, che è disponibile per la ricerca per tag, file di origine e testo:

      protolog_trace

      Figura 13. Traccia ProtoLog su Winscope.

    • Per le tracce Transizioni, viene visualizzato un elenco di transizioni con ID, tipo, data di invio, durata e stato, insieme alle proprietà della transizione selezionata:

      transitions_trace

      Figura 14. Traccia Transizioni su Winscope.