Le tracce Winscope possono essere raccolte con la riga di comando adb
nelle build di debug
(ovvero le build userdebug
e eng
). Prima di raccogliere le tracce Winscope
con adb
, esegui adb root
.
A partire da Android 15, le tracce di Winscope sono integrate in Perfetto e vengono raccolte utilizzando la riga di comando di Perfetto. Ogni traccia Winscope è un'origine dati Perfetto con una propria configurazione. Puoi attivare le configurazioni singolarmente o in un'unica sessione di tracciamento.
In Android 14 e versioni precedenti, ogni traccia Winscope ha un comando diverso e puoi raccoglierle separatamente. Per saperne di più, consulta la sezione Acquisire tracce in Android 14 e versioni precedenti.
WindowManager
Utilizza il nome dell'origine dati android.windowmanager
per questo tipo di traccia.
Opzioni di configurazione
Livello di log (
log_level
): specifica il livello di dettaglio del log. Valori supportati:LOG_LEVEL_VERBOSE
: registra tutti gli elementi con la massima quantità di informazioni.LOG_LEVEL_DEBUG
: registra tutti gli elementi, ma non scrive tutti i dati di configurazione.LOG_LEVEL_CRITICAL
: registra solo gli elementi visibili, con il minimo overhead delle prestazioni.
Frequenza log (
log_frequency
): definisce la frequenza con cui gli elementi vengono registrati:LOG_FREQUENCY_FRAME
: Traccia gli snapshot dello stato quando viene eseguito il commit di un frame.LOG_FREQUENCY_TRANSACTION
: Traccia gli snapshot dello stato ogni volta che viene eseguito il commit di una transazione.LOG_FREQUENCY_SINGLE_DUMP
: Traccia gli snapshot di un singolo stato all'avvio dell'origine dati.
Per maggiori dettagli sui valori di configurazione, vedi WindowManager.
Esempio
Di seguito è riportato un esempio del tipo di traccia WindowManager per adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
EOF
ProtoLog
Utilizza il nome dell'origine dati android.protolog
per questo tipo di traccia.
Opzioni di configurazione
Modalità di tracciamento (tracing_mode
): determina la configurazione dei log da utilizzare:
DEFAULT
: Traccia solo i gruppi di log e i livelli specificati ingroup_overrides
.ENABLE_ALL
: Traccia tutti i gruppi e i livelli di log, a meno che non siano specificati ingroup_overrides
.
Livello di log minimo (default_log_from_level
): se impostato, viene monitorato qualsiasi messaggio con un livello di log superiore o uguale a questo livello, a meno che non venga specificato un override del gruppo. Ad esempio, viene utilizzato per consentire la registrazione di tutti gli avvisi e gli errori, senza dover abilitare tutti i log. I valori supportati sono:
PROTOLOG_LEVEL_DEBUG
PROTOLOG_LEVEL_VERBOSE
PROTOLOG_LEVEL_INFO
PROTOLOG_LEVEL_WARN
PROTOLOG_LEVEL_ERROR
PROTOLOG_LEVEL_WTF
Override di gruppo (group_overrides
): consente la configurazione manuale del livello di log per ogni gruppo ProtoLog. Ogni gruppo contiene:
name
: il nome del gruppo ProtoLog, utilizzato nel codice sorgente di Android.log_from
: comedefault_log_from_level
, ma specificato solo per il gruppo corrente.collect_stacktrace
: se impostato sutrue
, raccoglie lo stack trace per ogni messaggio ProtoLog nel gruppo di cui viene eseguita la traccia.
Esempio
Di seguito è riportato un esempio del tipo di traccia ProtoLog per adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.protolog"
protolog_config: {
tracing_mode: DEFAULT
default_log_from_level: PROTOLOG_LEVEL_WARN
group_overrides: {
group_name: "WM_SHELL_STARTING_WINDOW"
log_from: PROTOLOG_LEVEL_DEBUG
collect_stacktrace: true
}
}
}
}
EOF
Input
Utilizza il nome dell'origine dati android.input.inputevent
per questo tipo di traccia.
Opzioni di configurazione
Modalità Traccia (trace_mode
): determina se la traccia di input deve essere
avviata utilizzando regole che tutelano la privacy o registrare tutti gli eventi di input:
TRACE_MODE_TRACE_ALL
: registra tutti gli eventi di input elaborati dal sistema, indipendentemente dal contesto in cui sono stati elaborati.TRACE_MODE_USE_RULES
: utilizza le regole di tracciamento definite in questa configurazione per specificare gli eventi da tracciare. Per ulteriori informazioni su come specificare le regole per la traccia, consultaandroid_input_event_config.proto
.
Esempio
Di seguito è riportato un esempio del tipo di traccia di input per adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.input.inputevent"
android_input_event_config: {
mode: TRACE_MODE_TRACE_ALL
}
}
}
EOF
SurfaceFlinger (livelli)
Utilizza il nome dell'origine dati android.surfaceflinger.layers
per questo tipo di traccia.
Opzioni di configurazione
Modalità di tracciamento (mode
): definisce la frequenza con cui vengono registrati gli elementi:
MODE_ACTIVE
: Snapshot dei livelli di traccia. Viene scattata un'istantanea ogni volta che si verifica una modifica dei livelli.MODE_GENERATED
: genera snapshot dei livelli dalle transazioni conservate nel buffer circolare interno di SurfaceFlinger. La generazione degli snapshot del livello si verifica quando questa origine dati viene svuotata.MODE_DUMP
: Traccia uno snapshot di un singolo livello.MODE_GENERATED_BUGREPORT_ONLY
: comeMODE_GENERATED
, ma attiva la generazione di snapshot dei livelli solo quando viene creato un report bug, non ogni volta che viene svuotata una traccia.
Flag di traccia (trace_flags
):
TRACE_FLAG_INPUT
: se la superficie contiene dati di input, tiene traccia dei dettagli della finestra di input.TRACE_FLAG_COMPOSITION
: Traccia il tipo di composizione e la regione visibile.TRACE_FLAG_EXTRA
: Traccia i metadati aggiuntivi della superficie, inclusi i livelli fuori schermo.TRACE_FLAG_HWC
: Traccia metadati aggiuntivi non strutturati del compositore hardware.TRACE_FLAG_BUFFERS
: configura SurfaceFlinger per tracciare tutte le modifiche al buffer sulla superficie. Per impostazione predefinita, SurfaceFlinger traccia un nuovo stato solo quando si verificano alterazioni della geometria.TRACE_FLAG_VIRTUAL_DISPLAYS
: Include i livelli di visualizzazione virtuale nella traccia.
Esempio
Di seguito è riportato un esempio del tipo di traccia SurfaceFlinger per adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
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
}
}
}
EOF
Per informazioni dettagliate sul significato dei diversi valori di configurazione, consulta SurfaceFlinger.
Transizioni della shell
Utilizza il nome dell'origine dati com.android.wm.shell.transition
per questo
tipo di traccia.
Opzioni di configurazione
Questo tipo di traccia non ha opzioni di configurazione.
Esempio
Di seguito è riportato un esempio del tipo di traccia della transizione della shell per adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "com.android.wm.shell.transition"
}
}
EOF
SurfaceFlinger (transazioni)
Utilizza il nome dell'origine dati android.surfaceflinger.transactions
per questo tipo di traccia.
Opzioni di configurazione
Modalità di tracciamento (mode
): definisce la frequenza con cui vengono registrati gli elementi:
MODE_CONTINUOUS
: SurfaceFlinger scrive il buffer circolare interno delle transazioni ogni volta che l'origine dati viene svuotata. Il buffer circolare contiene lo stato iniziale di SurfaceFlinger e le transazioni più recenti.MODE_ACTIVE
: SurfaceFlinger scrive lo stato iniziale e poi ogni transazione in entrata finché l'origine dati non viene arrestata.
Esempio
Di seguito è riportato un esempio del tipo di traccia delle transazioni SurfaceFlinger per adb.
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
EOF
IME
Utilizza il nome dell'origine dati: android.inputmethod
per questo tipo di traccia.
Opzioni di configurazione
Questo tipo di traccia non ha opzioni di configurazione.
Esempio
Di seguito è riportato un esempio del tipo di traccia IME per adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.inputmethod"
}
}
EOF
ViewCapture
Utilizza il nome dell'origine dati android.viewcapture
per questo tipo di traccia.
Opzioni di configurazione
Questo tipo di traccia non ha opzioni di configurazione.
Esempio
Di seguito è riportato un esempio del tipo di traccia ViewCapture per adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.viewcapture"
}
}
EOF
Esempio completo
Perfetto ti consente di raccogliere dati da più origini in un'unica configurazione. Puoi raccogliere tutte le tracce Winscope con un solo comando:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
data_sources: {
config {
name: "android.protolog"
protolog_config: {
tracing_mode: ENABLE_ALL
}
}
}
data_sources: {
config {
name: "android.input.inputevent"
android_input_event_config: {
mode: TRACE_MODE_TRACE_ALL
}
}
}
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
}
}
}
data_sources: {
config {
name: "com.android.wm.shell.transition"
}
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
data_sources: {
config {
name: "android.inputmethod"
}
}
data_sources: {
config {
name: "android.viewcapture"
}
}
EOF
Acquisire tracce in Android 14 e versioni precedenti
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.
Tracce di WindowManager
Per acquisire le tracce di WindowManager:
Abilita traccia:
adb shell wm tracing start
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 della 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) oall
(tutte le finestre e le informazioni):adb shell wm tracing level
Dump di WindowManager
Per acquisire i dump di WindowManager:
adb exec-out dumpsys window --proto > window_dump.winscope
ProtoLog
I seguenti comandi vengono utilizzati per il sistema ProtoLog.
Nel processo di system_server
:
Avvia ProtoLog:
adb shell cmd window logging start
Stop ProtoLog:
adb shell cmd window logging stop
Abilita ProtoLog per i gruppi di log specificati:
adb shell cmd window logging enable [group...]
Disabilita ProtoLog per i gruppi di log specificati:
adb shell cmd window logging disable [group...]
Attiva la registrazione di Logcat per i gruppi di log specificati:
adb shell cmd window logging enable-text [group...]
Disattiva la registrazione 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
Tracce di SurfaceFlinger (livelli)
Il tracciamento dei livelli SurfaceFlinger utilizza la traccia Perfetto per l'acquisizione. Per informazioni sulla configurazione, vedi Configurazione della traccia.
Vedi il seguente esempio di configurazione per la traccia dei livelli 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 la traccia dei livelli SurfaceFlinger:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
Dump di SurfaceFlinger (livelli)
Per acquisire i dump di SurfaceFlinger:
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
Transizioni della shell
I seguenti comandi vengono utilizzati per il tracciamento delle transizioni.
Nel processo di 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
Arresta una traccia in WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
I seguenti comandi vengono utilizzati per la tracciatura dell'Input Method Editor (IME):
Avvia la traccia IME per i client del metodo di input (IM), il servizio del metodo di input (IMS) e il servizio di gestione del metodo di input (IMMS):
adb shell ime tracing start
Inizia a tracciare i client IME, IMS e IMMS:
adb shell ime tracing stop
SurfaceFlinger (transazioni)
Il tracciamento delle transazioni di SurfaceFlinger utilizza la traccia Perfetto per l'acquisizione. Per informazioni sulla configurazione, vedi Configurazione della traccia.
Di seguito è riportato un esempio di configurazione di Perfetto per la traccia attiva 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
Di seguito è riportato un esempio di configurazione di Perfetto per la traccia continua 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
}
}
}
Consulta il seguente comando di esempio per generare la traccia delle transazioni di SurfaceFlinger:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \