Ślady Winscope możesz zbierać za pomocą wiersza poleceń adb w wersjach debugowania (czyli userdebug i eng). Przed zebraniem śladów Winscope za pomocą adb uruchom adb root.
Od Androida 15 ślady Winscope są zintegrowane z Perfetto i zbierane za pomocą wiersza poleceń Perfetto. Każdy ślad Winscope jest źródłem danych Perfetto z własną konfiguracją. Konfiguracje możesz włączać pojedynczo lub w ramach jednej sesji śledzenia.
W Androidzie 14 i starszych wersjach każdy ślad Winscope ma inne polecenie i możesz zbierać je niezależnie. Więcej informacji znajdziesz w artykule Rejestrowanie śladów w Androidzie 14 i starszych wersjach.
WindowManager
W przypadku tego typu śladu użyj nazwy źródła danych android.windowmanager.
Opcje konfiguracji
Poziom rejestrowania (
log_level): określa szczegółowość logu. Obsługiwane wartości:LOG_LEVEL_VERBOSE: rejestruje wszystkie elementy z maksymalną ilością informacji.LOG_LEVEL_DEBUG: rejestruje wszystkie elementy, ale nie zapisuje wszystkich danych konfiguracyjnych.LOG_LEVEL_CRITICAL: Rejestruje tylko widoczne elementy przy minimalnym obciążeniu wydajności.
Częstotliwość rejestrowania (
log_frequency): określa częstotliwość rejestrowania elementów:LOG_FREQUENCY_FRAME: Śledzi zrzuty stanu po zatwierdzeniu ramki.LOG_FREQUENCY_TRANSACTION: Logi czasu rejestrują zrzuty stanu za każdym razem, gdy transakcja jest zatwierdzana.LOG_FREQUENCY_SINGLE_DUMP: Śledzi pojedyncze zrzuty stanu po uruchomieniu źródła danych.
Szczegółowe informacje o wartościach konfiguracji znajdziesz w sekcji WindowManager.
Przykład
Poniższy przykład pokazuje typ śledzenia WindowManager w przypadku 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
W przypadku tego typu śladu użyj nazwy źródła danych android.protolog.
Opcje konfiguracji
Tryb śledzenia (tracing_mode): określa konfigurację logów, która ma być używana:
DEFAULT: ślady rejestrują tylko grupy dzienników i poziomy określone wgroup_overrides.ENABLE_ALL: śledzi wszystkie grupy dzienników i poziomy, chyba że określono je wgroup_overrides.
Minimalny poziom rejestrowania (default_log_from_level): jeśli ta opcja jest ustawiona, śledzone są wszystkie wiadomości o poziomie rejestrowania wyższym lub równym temu poziomowi, chyba że określono zastąpienie na poziomie grupy. Na przykład służy to do włączania rejestrowania wszystkich ostrzeżeń i błędów bez konieczności włączania wszystkich logów. Obsługiwane wartości to:
PROTOLOG_LEVEL_DEBUGPROTOLOG_LEVEL_VERBOSEPROTOLOG_LEVEL_INFOPROTOLOG_LEVEL_WARNPROTOLOG_LEVEL_ERRORPROTOLOG_LEVEL_WTF
Zastąpienia grup (group_overrides): umożliwia ręczną konfigurację poziomu logowania dla każdej grupy ProtoLog. Każda grupa zawiera:
name: nazwa grupy ProtoLog używana w kodzie źródłowym Androida.log_from: to samo codefault_log_from_level, ale określone tylko dla bieżącej grupy.collect_stacktrace: gdy ta wartość jest ustawiona natrue, zbiera ślad stosu dla każdej wiadomości ProtoLog w śledzonej grupie.
Przykład
Poniższy przykład pokazuje typ śledzenia ProtoLog dla 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
Urządzenie wejściowe
W przypadku tego typu śladu użyj nazwy źródła danych android.input.inputevent.
Opcje konfiguracji
Tryb śledzenia (trace_mode): określa, czy śledzenie danych wejściowych powinno być uruchamiane z użyciem reguł chroniących prywatność, czy też rejestrować wszystkie zdarzenia wejściowe:
TRACE_MODE_TRACE_ALL: rejestruje wszystkie zdarzenia wejściowe przetwarzane przez system, niezależnie od kontekstu, w którym zostały przetworzone.TRACE_MODE_USE_RULES: używa reguł śledzenia zdefiniowanych w tej konfiguracji, aby określić, które zdarzenia mają być śledzone. Więcej informacji o określaniu reguł śledzenia znajdziesz w sekcjiandroid_input_event_config.proto.
Przykład
Oto przykład typu śledzenia danych wejściowych dla 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 (warstwy)
W przypadku tego typu śladu użyj nazwy źródła danych android.surfaceflinger.layers.
Opcje konfiguracji
Tryb śledzenia (mode): określa częstotliwość rejestrowania elementów:
MODE_ACTIVE: zrzuty warstw śladów. Migawka jest robiona za każdym razem, gdy następuje zmiana warstw.MODE_GENERATED: generuje zrzuty warstw z transakcji przechowywanych w wewnętrznym buforze pierścieniowym SurfaceFlingera. Generowanie migawek warstwy następuje, gdy to źródło danych jest opróżniane.MODE_DUMP: Śledzi pojedynczy zrzut warstw.MODE_GENERATED_BUGREPORT_ONLY: Tak samo jakMODE_GENERATED, ale wywołuje generowanie migawek warstw tylko wtedy, gdy zostanie zgłoszony błąd, a nie za każdym razem, gdy zostanie opróżniony ślad.
Flagi śledzenia (trace_flags):
TRACE_FLAG_INPUT: jeśli powierzchnia zawiera dane wejściowe, śledzi szczegóły okna wejściowego.TRACE_FLAG_COMPOSITION: Śledzi typ kompozycji i widoczny region.TRACE_FLAG_EXTRA: Śledzi dodatkowe metadane powierzchni, w tym warstwy poza ekranem.TRACE_FLAG_HWC: Śledzi dodatkowe nieustrukturyzowane metadane kompozytora sprzętu.TRACE_FLAG_BUFFERS: konfiguruje SurfaceFlinger tak, aby śledził wszystkie zmiany bufora na powierzchni. Domyślnie SurfaceFlinger śledzi nowy stan tylko wtedy, gdy nastąpią zmiany w geometrii.TRACE_FLAG_VIRTUAL_DISPLAYS: zawiera w śladzie warstwy wyświetlacza wirtualnego.
Przykład
Poniższy przykład pokazuje typ śledzenia SurfaceFlinger w przypadku 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
Szczegółowe informacje o znaczeniu różnych wartości konfiguracji znajdziesz w sekcji SurfaceFlinger.
Przejścia między powłokami
W przypadku tego typu śladu użyj nazwy źródła danych com.android.wm.shell.transition.
Opcje konfiguracji
Ten typ śledzenia nie ma opcji konfiguracji.
Przykład
Poniższy przykład pokazuje typ śledzenia przejścia powłoki w przypadku 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 (transakcje)
Użyj nazwy źródła danych android.surfaceflinger.transactions dla tego typu śledzenia.
Opcje konfiguracji
Tryb śledzenia (mode): określa częstotliwość rejestrowania elementów:
MODE_CONTINUOUS: SurfaceFlinger zapisuje swój wewnętrzny bufor pierścieniowy transakcji za każdym razem, gdy źródło danych jest opróżniane. Bufor pierścieniowy zawiera stan początkowy SurfaceFlingera i najnowsze transakcje.MODE_ACTIVE: SurfaceFlinger zapisuje stan początkowy, a potem każdą przychodzącą transakcję, dopóki źródło danych nie zostanie zatrzymane.
Przykład
Poniższy przykład pokazuje typ śledzenia transakcji SurfaceFlinger w przypadku 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
W przypadku tego typu śladu użyj nazwy źródła danych android.inputmethod.
Opcje konfiguracji
Ten typ śledzenia nie ma opcji konfiguracji.
Przykład
Poniższy przykład pokazuje typ śledzenia IME w przypadku 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
W przypadku tego typu śladu użyj nazwy źródła danych android.viewcapture.
Opcje konfiguracji
Ten typ śledzenia nie ma opcji konfiguracji.
Przykład
W tym przykładzie pokazujemy typ śledzenia ViewCapture w przypadku 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
Pełny przykład
Perfetto umożliwia zbieranie danych z wielu źródeł w ramach jednej konfiguracji. Wszystkie ślady Winscope możesz zebrać za pomocą jednego polecenia:
$ 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
Rejestrowanie śladów w Androidzie 14 i starszych
Uruchom adb root przed uruchomieniem poleceń adb shell dla każdego z tych śladów. Po zakończeniu śledzenia pliki śledzenia są dostępne w /data/misc/wmtrace. Aby skopiować plik lub katalog i jego podkatalogi z urządzenia, zapoznaj się z artykułem Kopiowanie plików na urządzenie i z urządzenia.
Ślady WindowManager
Aby przechwycić ślady WindowManager:
Włącz śledzenie:
adb shell wm tracing startWyłącz śledzenie:
adb shell wm tracing stopZapisywanie danych logowania w pliku podczas przechwytywania śladu:
adb shell wm tracing save-for-bugreportRejestruj ślad raz na klatkę:
adb shell wm tracing frameRejestruj każdą transakcję:
adb shell wm tracing transactionUstaw maksymalny rozmiar dziennika (w KB):
adb shell wm tracing sizeStan śledzenia wydruku:
adb shell wm tracing statusUstaw poziom rejestrowania na
critical(tylko widoczne okna z ograniczonymi informacjami),trim(wszystkie okna z ograniczonymi informacjami) luball(wszystkie okna i informacje):adb shell wm tracing level
Zrzuty WindowManager
Aby przechwycić zrzuty WindowManager:
adb exec-out dumpsys window --proto > window_dump.winscope
ProtoLog
W systemie ProtoLog używane są te polecenia:
W procesie system_server:
Uruchom ProtoLog:
adb shell cmd window logging startZatrzymaj ProtoLog:
adb shell cmd window logging stopWłącz ProtoLog dla wybranych grup logów:
adb shell cmd window logging enable [group...]Wyłącz ProtoLog w przypadku wybranych grup logów:
adb shell cmd window logging disable [group...]Włącz logowanie Logcat w przypadku wybranych grup logów:
adb shell cmd window logging enable-text [group...]Wyłącz logowanie Logcat w przypadku wybranych grup logów:
adb shell cmd window logging disable-text [group...]
W WMShell:
Uruchom ProtoLog:
adb shell dumpsys activity service SystemUIService WMShell
Ślady SurfaceFlingera (warstwy)
Śledzenie warstwy SurfaceFlinger wykorzystuje ślad Perfetto do przechwytywania. Informacje o konfiguracji znajdziesz w sekcji Konfiguracja śledzenia.
Poniżej znajdziesz przykład konfiguracji śledzenia warstwy 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
}
}
}
Poniższe polecenie generuje śledzenie warstw SurfaceFlinger:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
Zrzuty SurfaceFlingera (warstwy)
Aby przechwycić zrzuty SurfaceFlingera, uruchom to polecenie:
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
Przejścia między powłokami
Do śledzenia przejść używane są te polecenia:
W procesie system_server użyj tych poleceń:
Rozpocznij śledzenie:
adb shell cmd window shell tracing startZatrzymywanie śledzenia:
adb shell cmd window shell tracing stopRozpocznij śledzenie w WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing startZatrzymywanie śledzenia w WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
Do śledzenia edytora metody wprowadzania (IME) służą te polecenia:
- Rozpocznij śledzenie edytora IME dla klientów metody wprowadzania (IM), usługi metody wprowadzania (IMS) i usługi zarządzania metodą wprowadzania (IMMS):
adb shell ime tracing start
Rozpocznij śledzenie klientów IME, IMS i IMMS:
adb shell ime tracing stop
SurfaceFlinger (transakcje)
Śledzenie transakcji SurfaceFlinger wykorzystuje ślad Perfetto do rejestrowania. Informacje o konfiguracji znajdziesz w sekcji Konfiguracja śledzenia.
Poniższy przykład pokazuje konfigurację Perfetto dla aktywnego śledzenia SurfaceFlingera:
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
Poniższy przykład pokazuje konfigurację Perfetto dla ciągłego śledzenia SurfaceFlingera:
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
}
}
}
Poniższe polecenie generuje śledzenie transakcji SurfaceFlinger:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \