Winscope-Traces können mit der adb
-Befehlszeile in Debug-Builds (userdebug
- und eng
-Builds) erfasst werden. Bevor Sie WinScope-Traces mit adb
erfassen, führen Sie adb root
aus.
Ab Android 15 sind Winscope-Traces in Perfetto integriert und werden über die Perfetto-Befehlszeile erfasst. Jeder Winscope-Trace ist eine Perfetto-Datenquelle mit einer eigenen Konfiguration. Sie können Konfigurationen einzeln oder in einer einzelnen Sitzung aktivieren.
Unter Android 14 und niedriger hat jede Winscope-Spur einen anderen Befehl und Sie können sie unabhängig voneinander erfassen. Weitere Informationen finden Sie unter Speicherung von Protokollen unter Android 14 und niedriger.
WindowManager
Verwenden Sie für diesen Trace-Typ den Datenquellennamen android.windowmanager
.
Konfigurationsoptionen
Protokollebene (
log_level
): Gibt die Ausführlichkeit der Protokolle an. Unterstützte Werte:LOG_LEVEL_VERBOSE
: Alle Elemente werden mit der maximalen Anzahl von Informationen protokolliert.LOG_LEVEL_DEBUG
: Alle Elemente werden protokolliert, aber nicht alle Konfigurationsdaten werden geschrieben.LOG_LEVEL_CRITICAL
: Es werden nur sichtbare Elemente protokolliert, wobei der Leistungsoverhead minimal ist.
Protokollierungshäufigkeit (
log_frequency
): Hiermit wird festgelegt, wie oft Elemente protokolliert werden:LOG_FREQUENCY_FRAME
: Erfasst Status-Snapshots, wenn ein Frame verbindlich wird.LOG_FREQUENCY_TRANSACTION
: Erfasst Status-Snapshots jedes Mal, wenn eine Transaktion verbindlich wird.LOG_FREQUENCY_SINGLE_DUMP
: Erfasst Snapshots des einzelnen Zustands, wenn die Datenquelle gestartet wird.
Weitere Informationen zu Konfigurationswerten finden Sie unter WindowManager.
Verwendungsbeispiele
Im Folgenden finden Sie ein Beispiel für den Trace-Typ „WindowManager“ 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 Protokollkonfiguration:
DEFAULT
: Es werden nur die in dergroup_overrides
angegebenen Protokollgruppen und ‑ebenen protokolliert.ENABLE_ALL
: Es werden alle Loggruppen und ‑ebenen protokolliert, sofern dies nicht in dergroup_overrides
angegeben ist.
Minimale Logebene (default_log_from_level
): Wenn diese Option festgelegt ist, werden alle Nachrichten mit einer Logebene, die höher oder gleich dieser Ebene ist, geloggt, sofern keine Gruppenüberschreibung angegeben ist. So können Sie beispielsweise alle Warnungen und Fehler protokollieren, ohne alle Protokolle aktivieren zu müssen. Folgende Werte werden unterstützt:
PROTOLOG_LEVEL_DEBUG
PROTOLOG_LEVEL_VERBOSE
PROTOLOG_LEVEL_INFO
PROTOLOG_LEVEL_WARN
PROTOLOG_LEVEL_ERROR
PROTOLOG_LEVEL_WTF
Gruppenüberschreibungen (group_overrides
): Hiermit können Sie die Protokollebene für jede ProtoLog-Gruppe manuell konfigurieren. Jede Gruppe enthält Folgendes:
name
: Name der ProtoLog-Gruppe, die im Android-Quellcode verwendet wird.log_from
: Entsprichtdefault_log_from_level
, wird aber nur für die aktuelle Gruppe angegeben.collect_stacktrace
: Wenn dieser Parameter auftrue
festgelegt ist, wird der Stack-Trace für jede ProtoLog-Nachricht in der zu verfolgenden Gruppe erfasst.
Verwendungsbeispiele
Im Folgenden finden Sie ein Beispiel für 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 die Eingabe-Trace mit datenschutzfreundlichen Regeln gestartet oder alle Eingabeereignisse aufgezeichnet werden sollen:
TRACE_MODE_TRACE_ALL
: Hier werden alle vom System verarbeiteten Eingabeereignisse aufgezeichnet, unabhängig vom Kontext, in dem sie verarbeitet wurden.TRACE_MODE_USE_RULES
: Hiermit werden die in dieser Konfiguration definierten Regeln für die Ablaufverfolgung verwendet, um anzugeben, welche Ereignisse erfasst werden sollen. Weitere Informationen zum Festlegen der Regeln für die Trace finden Sie unterandroid_input_event_config.proto
.
Verwendungsbeispiele
Im Folgenden finden Sie ein Beispiel für 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
): Hiermit wird festgelegt, wie oft Elemente protokolliert werden:
MODE_ACTIVE
: Erfasst Ebenen-Snapshots. Jedes Mal, wenn sich die Ebenen ändern, wird ein Snapshot erstellt.MODE_GENERATED
: Er generiert Layers-Snapshots aus den Transaktionen, die im internen Ringbuffer von SurfaceFlinger gespeichert werden. Die Snapshot-Generierung der Ebene erfolgt, wenn diese Datenquelle geleert wird.MODE_DUMP
: Erfasst einen Snapshot einer einzelnen Ebene.MODE_GENERATED_BUGREPORT_ONLY
: EntsprichtMODE_GENERATED
, löst aber die Generierung von Ebenen-Snapshots nur aus, wenn ein Fehlerbericht erstellt wird, nicht jedes Mal, wenn ein Trace gelöscht wird.
Trace-Flags (trace_flags
):
TRACE_FLAG_INPUT
: Wenn die Oberfläche Eingabedaten enthält, werden die Spezifikationen des Eingabefensters erfasst.TRACE_FLAG_COMPOSITION
: Der Kompositionstyp und die sichtbare Region werden nachgezeichnet.TRACE_FLAG_EXTRA
: Erfasst zusätzliche Oberflächenmetadaten, einschließlich nicht sichtbarer Ebenen.TRACE_FLAG_HWC
: Erfasst zusätzliche unstrukturierte Metadaten des Hardware-Composers.TRACE_FLAG_BUFFERS
: Konfiguriert SurfaceFlinger so, dass alle Pufferänderungen auf der Oberfläche erfasst werden. Standardmäßig zeichnet SurfaceFlinger nur dann einen neuen Status auf, wenn geometrische Änderungen auftreten.TRACE_FLAG_VIRTUAL_DISPLAYS
: Enthält virtuelle Anzeigeebenen im Trace.
Verwendungsbeispiele
Im Folgenden finden Sie ein Beispiel für 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 verschiedener 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 Tracetyp gibt es keine Konfigurationsoptionen.
Verwendungsbeispiele
Im folgenden Beispiel wird der Shell-Übergangs-Trace-Typ für adb verwendet:
$ 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
): Hiermit wird festgelegt, wie oft 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 neuesten Transaktionen.MODE_ACTIVE
: SurfaceFlinger schreibt den Anfangsstatus und dann jede eingehende Transaktion, bis die Datenquelle angehalten wird.
Verwendungsbeispiele
Im Folgenden finden Sie ein Beispiel für den Trace-Typ „SurfaceFlinger-Transaktionen“ 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 Namen der Datenquelle: android.inputmethod
.
Konfigurationsoptionen
Für diesen Tracetyp gibt es keine Konfigurationsoptionen.
Verwendungsbeispiele
Im Folgenden finden Sie ein Beispiel für 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 Tracetyp gibt es keine Konfigurationsoptionen.
Verwendungsbeispiele
Im folgenden Beispiel wird der Trace-Typ „ViewCapture“ für adb verwendet:
$ 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-Protokolle 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 unter Android 14 und niedriger erfassen
Führen Sie für jede der folgenden Traces adb root
aus, bevor Sie die adb shell
-Befehle ausführen. Am Ende des Tracings sind die Trace-Dateien unter /data/misc/wmtrace
verfügbar. Wie Sie eine Datei oder ein Verzeichnis und seine Unterverzeichnisse von einem Gerät kopieren, erfahren Sie hier.
WindowManager-Traces
So erfassen Sie WindowManager-Traces:
Trace aktivieren:
adb shell wm tracing start
Trace deaktivieren:
adb shell wm tracing stop
Protokolldaten während einer Ablaufverfolgung in einer Datei speichern:
adb shell wm tracing save-for-bugreport
Trace einmal pro Frame protokollieren:
adb shell wm tracing frame
Jede Transaktion protokollieren:
adb shell wm tracing transaction
Legen Sie die maximale Protokollgröße in KB fest:
adb shell wm tracing size
Trace-Status drucken:
adb shell wm tracing status
Legen Sie die Protokollebene 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 start
ProtoLog beenden:
adb shell cmd window logging stop
ProtoLog für bestimmte Protokollgruppen aktivieren:
adb shell cmd window logging enable [group...]
ProtoLog für bestimmte Loggruppen deaktivieren:
adb shell cmd window logging disable [group...]
Aktivieren Sie das Logcat-Logging für bestimmte Loggruppen:
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 SurfaceFlinger-Ebenen-Tracing wird die Perfetto-Spur zum Erfassen verwendet. Konfigurationsinformationen finden Sie unter Trace-Konfiguration.
Im folgenden Beispiel wird eine Konfiguration für das SurfaceFlinger-Ebenen-Tracing gezeigt:
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
}
}
}
Im folgenden Beispiel wird ein Befehl zum Generieren von Tracings für SurfaceFlinger-Ebenen gezeigt:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
SurfaceFlinger-Dumps (Ebenen)
So erfassen Sie SurfaceFlinger-Dumps:
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
Shell-Übergänge
Die folgenden Befehle werden für die Übergangsverfolgung verwendet.
Im system_server
-Prozess:
So starten Sie einen Trace:
adb shell cmd window shell tracing start
Trace beenden:
adb shell cmd window shell tracing stop
So starten Sie einen Trace in der WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
So beenden Sie eine Trace-Datei in der WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
Die folgenden Befehle werden für die Eingabemethode-Eingabe (Input Method Editor, IME) verwendet:
Starten Sie die IME-Aufzeichnung für IM-Clients (Eingabemethoden), IMS (Eingabemethodendienst) und IMMS (Eingabemethodenverwaltungsdienst):
adb shell ime tracing start
Starten Sie die IME-Clients, IMS und IMMS:
adb shell ime tracing stop
SurfaceFlinger (Transaktionen)
Für die Transaktionsaufzeichnung von SurfaceFlinger wird die Perfetto-Spur verwendet. Konfigurationsinformationen finden Sie unter Trace-Konfiguration.
Im folgenden Beispiel wird eine Perfetto-Konfiguration für das aktive Tracing von SurfaceFlinger gezeigt:
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
Im folgenden Beispiel wird eine Perfetto-Konfiguration für das kontinuierliche Tracing von SurfaceFlinger gezeigt:
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
}
}
}
Im folgenden Beispiel wird ein Befehl zum Generieren von Tracings für SurfaceFlinger-Transaktionen gezeigt:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \