Sie können Winscope-Traces mit der adb-Befehlszeile in Debug-Builds (d. h. userdebug- und eng-Builds) erfassen. Führen Sie vor dem Erfassen von Winscope-Traces
mit adb den Befehl adb root aus.
Ab Android 15 sind Winscope-Traces in Perfetto integriert und werden mit der Perfetto Befehlszeile erfasst. Jeder Winscope-Trace ist eine Perfetto-Datenquelle mit eigener Konfiguration. Sie können Konfigurationen einzeln oder in einer einzigen Tracing-Sitzung aktivieren.
In Android 14 und niedriger hat jeder Winscope-Trace einen anderen Befehl und Sie können jeden unabhängig erfassen. Weitere Informationen finden Sie unter Traces in Android 14 und niedriger erfassen.
WindowManager
Verwenden Sie für diesen Trace-Typ den Datenquellennamen android.windowmanager.
Konfigurationsoptionen
Logebene (
log_level) : Gibt die Ausführlichkeit der Logs an. Unterstützte Werte:LOG_LEVEL_VERBOSE: Protokolliert alle Elemente mit der maximalen Menge an Informationen.LOG_LEVEL_DEBUG: Protokolliert alle Elemente, schreibt aber nicht alle Konfigurationsdaten.LOG_LEVEL_CRITICAL: Protokolliert nur sichtbare Elemente mit dem geringsten Leistungsaufwand.
Logfrequenz (
log_frequency): Definiert die Frequenz, mit der Elemente protokolliert werden:LOG_FREQUENCY_FRAME: Erfasst Traces von Status-Snapshots, wenn ein Frame übernommen wird.LOG_FREQUENCY_TRANSACTION: Erfasst Traces von Status-Snapshots jedes Mal, wenn eine Transaktion übernommen wird.LOG_FREQUENCY_SINGLE_DUMP: Erfasst Traces von einzelnen Status-Snapshots, wenn die Datenquelle gestartet wird.
Weitere Informationen zu Konfigurationswerten finden Sie unter WindowManager.
Beispiel
Das folgende Beispiel zeigt den WindowManager-Trace-Typ für 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
Verwenden Sie für diesen Trace-Typ den Datenquellennamen android.protolog.
Konfigurationsoptionen
Tracing-Modus (tracing_mode): Bestimmt die zu verwendende Logkonfiguration:
DEFAULT: Erfasst Traces nur von Loggruppen und -ebenen, die in dengroup_overridesangegeben sind.ENABLE_ALL: Erfasst Traces von allen Loggruppen und -ebenen, sofern nicht in dengroup_overridesangegeben.
Minimale Logebene (default_log_from_level): Wenn festgelegt, wird jede Nachricht mit einer Logebene, die höher oder gleich dieser Ebene ist, erfasst, es sei denn, eine Gruppenüberschreibung ist angegeben. Dies wird beispielsweise verwendet, um alle Warnungen und Fehler zu protokollieren, ohne alle Logs aktivieren zu müssen. Folgende Werte werden unterstützt:
PROTOLOG_LEVEL_DEBUGPROTOLOG_LEVEL_VERBOSEPROTOLOG_LEVEL_INFOPROTOLOG_LEVEL_WARNPROTOLOG_LEVEL_ERRORPROTOLOG_LEVEL_WTF
Gruppenüberschreibungen (group_overrides): Ermöglicht die manuelle Konfiguration der Logebene für jede ProtoLog-Gruppe. Jede Gruppe enthält:
name: Name der ProtoLog-Gruppe, verwendet im Android-Quellcode.log_from: Entsprichtdefault_log_from_level, wird aber nur für die aktuelle Gruppe angegeben.collect_stacktrace: Wenn auftruegesetzt, wird der Stacktrace für jede ProtoLog-Nachricht in der Gruppe erfasst, die erfasst wird.
Beispiel
Das folgende Beispiel zeigt den ProtoLog-Trace-Typ für 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
Eingabe
Verwenden Sie für diesen Trace-Typ den Datenquellennamen android.input.inputevent.
Konfigurationsoptionen
Trace-Modus (trace_mode): Bestimmt, ob der Eingabe-Trace mit datenschutzfreundlichen Regeln gestartet oder alle Eingabeereignisse aufgezeichnet werden sollen:
TRACE_MODE_TRACE_ALL: Zeichnet alle Eingabeereignisse auf, die vom System verarbeitet werden, unabhängig vom Kontext, in dem sie verarbeitet wurden.TRACE_MODE_USE_RULES: Verwendet die in dieser Konfiguration definierten Tracing-Regeln, um anzugeben, welche Ereignisse erfasst werden sollen. Weitere Informationen zum Angeben der Regeln für den Trace finden Sie unterandroid_input_event_config.proto.
Beispiel
Das folgende Beispiel zeigt den Eingabe-Trace-Typ für 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 (Ebenen)
Verwenden Sie für diesen Trace-Typ den Datenquellennamen android.surfaceflinger.layers.
Konfigurationsoptionen
Tracing-Modus (mode): Definiert die Frequenz, mit der Elemente protokolliert werden:
MODE_ACTIVE: Erfasst Traces von Ebenen-Snapshots. Jedes Mal, wenn sich Ebenen ändern, wird ein Snapshot erstellt.MODE_GENERATED: Generiert Ebenen-Snapshots aus den Transaktionen, die im internen Ringpuffer von SurfaceFlinger gespeichert sind. Die Generierung von Ebenen-Snapshots erfolgt, wenn diese Datenquelle geleert wird.MODE_DUMP: Erfasst Traces von einem einzelnen Ebenen-Snapshot.MODE_GENERATED_BUGREPORT_ONLY: EntsprichtMODE_GENERATED, löst die Generierung von Ebenen-Snapshots aber nur aus, wenn ein Fehlerbericht erstellt wird, nicht jedes Mal, wenn ein Trace geleert wird.
Trace-Flags (trace_flags):
TRACE_FLAG_INPUT: Wenn die Oberfläche Eingabedaten enthält, werden die Details des Eingabefensters erfasst.TRACE_FLAG_COMPOSITION: Erfasst Traces des Kompositionstyps und der sichtbaren Region.TRACE_FLAG_EXTRA: Erfasst Traces zusätzlicher Oberflächenmetadaten, einschließlich Offscreen-Ebenen.TRACE_FLAG_HWC: Erfasst Traces zusätzlicher unstrukturierter Metadaten des Hardware-Composers.TRACE_FLAG_BUFFERS: Konfiguriert SurfaceFlinger so, dass alle Pufferänderungen auf der Oberfläche erfasst werden. Standardmäßig erfasst SurfaceFlinger nur dann einen neuen Status, wenn Geometrieänderungen auftreten.TRACE_FLAG_VIRTUAL_DISPLAYS: Bezieht virtuelle Anzeigeebenen in den Trace ein.
Beispiel
Das folgende Beispiel zeigt den SurfaceFlinger-Trace-Typ für 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
Weitere Informationen zur Bedeutung der verschiedenen Konfigurationswerte finden Sie unter SurfaceFlinger.
Shell-Übergänge
Verwenden Sie für diesen Trace-Typ den Datenquellennamen com.android.wm.shell.transition.
Konfigurationsoptionen
Für diesen Trace-Typ sind keine Konfigurationsoptionen verfügbar.
Beispiel
Das folgende Beispiel zeigt den Shell-Übergangs-Trace-Typ für 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 (Transaktionen)
Verwenden Sie für diesen Trace-Typ den Datenquellennamen android.surfaceflinger.transactions.
Konfigurationsoptionen
Tracing-Modus (mode): Definiert die Frequenz, mit der Elemente protokolliert werden:
MODE_CONTINUOUS: SurfaceFlinger schreibt seinen internen Ringpuffer mit Transaktionen jedes Mal, wenn die Datenquelle geleert wird. Der Ringpuffer enthält den Anfangsstatus von SurfaceFlinger und die letzten Transaktionen.MODE_ACTIVE: SurfaceFlinger schreibt den Anfangsstatus und dann jede eingehende Transaktion, bis die Datenquelle beendet wird.
Beispiel
Das folgende Beispiel zeigt den SurfaceFlinger-Transaktions-Trace-Typ für 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
Verwenden Sie für diesen Trace-Typ den Datenquellennamen android.inputmethod.
Konfigurationsoptionen
Für diesen Trace-Typ sind keine Konfigurationsoptionen verfügbar.
Beispiel
Das folgende Beispiel zeigt den IME-Trace-Typ für 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
Verwenden Sie für diesen Trace-Typ den Datenquellennamen android.viewcapture.
Konfigurationsoptionen
Für diesen Trace-Typ sind keine Konfigurationsoptionen verfügbar.
Beispiel
Das folgende Beispiel zeigt den ViewCapture-Trace-Typ für 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
Vollständiges Beispiel
Mit Perfetto können Sie Daten aus mehreren Quellen in einer einzigen Konfiguration erfassen. Sie können alle Winscope-Traces mit einem einzigen Befehl erfassen:
$ 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
Traces in Android 14 und niedriger erfassen
Führen Sie adb root aus, bevor Sie die adb shell-Befehle für jeden der folgenden Traces ausführen. Am Ende des Traces sind die Trace-Dateien unter /data/misc/wmtrace verfügbar. Informationen zum Kopieren einer Datei oder eines Verzeichnisses und seiner Unterverzeichnisse von
einem Gerät finden Sie unter
Dateien auf ein Gerät und von einem Gerät kopieren.
WindowManager-Traces
So erfassen Sie WindowManager-Traces:
Trace aktivieren:
adb shell wm tracing startTrace deaktivieren:
adb shell wm tracing stopProtokolldaten während der Trace-Erfassung in einer Datei speichern:
adb shell wm tracing save-for-bugreportTrace einmal pro Frame protokollieren:
adb shell wm tracing frameJede Transaktion protokollieren:
adb shell wm tracing transactionMaximale Loggröße in KB festlegen:
adb shell wm tracing sizeTrace-Status ausgeben:
adb shell wm tracing statusLegen Sie die Logebene auf
critical(nur sichtbare Fenster mit reduzierten Informationen),trim(alle Fenster mit reduzierten Informationen) oderall(alle Fenster und Informationen) fest:adb shell wm tracing level
WindowManager-Dumps
So erfassen Sie WindowManager-Dumps:
adb exec-out dumpsys window --proto > window_dump.winscope
ProtoLog
Die folgenden Befehle werden für das ProtoLog System verwendet.
Im system_server-Prozess:
ProtoLog starten:
adb shell cmd window logging startProtoLog beenden:
adb shell cmd window logging stopProtoLog für bestimmte Loggruppen aktivieren:
adb shell cmd window logging enable [group...]ProtoLog für bestimmte Loggruppen deaktivieren:
adb shell cmd window logging disable [group...]Logcat-Logging für bestimmte Loggruppen aktivieren:
adb shell cmd window logging enable-text [group...]Logcat-Logging für bestimmte Loggruppen deaktivieren:
adb shell cmd window logging disable-text [group...]
In WMShell:
ProtoLog starten:
adb shell dumpsys activity service SystemUIService WMShell
SurfaceFlinger-Traces (Ebenen)
Für das Tracing von SurfaceFlinger-Ebenen wird Perfetto-Trace für die Erfassung verwendet. Konfigurationsinformationen finden Sie unter Trace-Konfiguration für Konfigurationsinformationen.
Das folgende Beispiel zeigt eine Konfiguration für das Tracing von SurfaceFlinger-Ebenen:
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
}
}
}
Der folgende Beispielbefehl generiert Tracing für SurfaceFlinger-Ebenen:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
SurfaceFlinger-Dumps (Ebenen)
Führen Sie den folgenden Befehl aus, um SurfaceFlinger-Dumps zu erfassen:
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
Shell-Übergänge
Die folgenden Befehle werden für das Tracing von Übergängen verwendet.
Verwenden Sie im system_server-Prozess die folgenden Befehle:
Trace starten:
adb shell cmd window shell tracing startTrace beenden:
adb shell cmd window shell tracing stopTrace in WMShell starten:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing startTrace in WMShell beenden:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
Die folgenden Befehle werden für das Tracing des Eingabemethoden-Editors (Input Method Editor, IME) verwendet:
- IME-Tracing für Eingabemethoden-Clients (Input Method, IM), Eingabemethoden-Dienste (Input Method Service, IMS) und Eingabemethoden-Verwaltungsdienste (Input Method Management Service, IMMS) starten:
adb shell ime tracing start
Tracing von IME-Clients, IMS und IMMS starten:
adb shell ime tracing stop
SurfaceFlinger (Transaktionen)
Für das Tracing von SurfaceFlinger-Transaktionen wird Perfetto-Trace für die Erfassung verwendet. Konfigurationsinformationen finden Sie unter Trace-Konfiguration für Konfigurationsinformationen.
Das folgende Beispiel zeigt eine Perfetto-Konfiguration für das aktive Tracing von 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
Das folgende Beispiel zeigt eine Perfetto-Konfiguration für das SurfaceFlinger kontinuierliche Tracing:
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
}
}
}
Der folgende Beispielbefehl generiert Tracing für SurfaceFlinger-Transaktionen:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \