Ślady Winscope można zbierać za pomocą wiersza poleceń adb
w wersjach debugowania
(czyli w wersjach 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żej znajdziesz przykład typu ś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_DEBUG
PROTOLOG_LEVEL_VERBOSE
PROTOLOG_LEVEL_INFO
PROTOLOG_LEVEL_WARN
PROTOLOG_LEVEL_ERROR
PROTOLOG_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
Oto przykład typu ś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
Oto przykład typu śladu SurfaceFlinger 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.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
Użyj nazwy źródła danych com.android.wm.shell.transition
dla tego typu śledzenia.
Opcje konfiguracji
Ten typ śledzenia nie ma opcji konfiguracji.
Przykład
Oto przykład typu śladu 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 początkowy stan 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żej znajdziesz przykład typu śledzenia transakcji SurfaceFlinger 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.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
EOF
IME
Użyj nazwy źródła danych: android.inputmethod
dla tego typu śledzenia.
Opcje konfiguracji
Ten typ śledzenia nie ma opcji konfiguracji.
Przykład
Oto przykład typu ś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
Oto przykład typu ś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 start
Wyłącz śledzenie:
adb shell wm tracing stop
Zapisywanie danych logowania w pliku podczas przechwytywania śladu:
adb shell wm tracing save-for-bugreport
Rejestruj ślad raz na klatkę:
adb shell wm tracing frame
Rejestruj każdą transakcję:
adb shell wm tracing transaction
Ustaw maksymalny rozmiar dziennika (w KB):
adb shell wm tracing size
Stan śledzenia wydruku:
adb shell wm tracing status
Ustaw 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 start
Zatrzymaj ProtoLog:
adb shell cmd window logging stop
Włą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.
Oto 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
}
}
}
Aby wygenerować śledzenie warstw SurfaceFlinger, użyj tego przykładowego polecenia:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
Zrzuty SurfaceFlingera (warstwy)
Aby przechwycić zrzuty usługi SurfaceFlinger:
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
:
Rozpocznij śledzenie:
adb shell cmd window shell tracing start
Zatrzymywanie śledzenia:
adb shell cmd window shell tracing stop
Rozpocznij śledzenie w WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
Zatrzymywanie śledzenia w WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
Do śledzenia edytora metody wprowadzania (IME) służą te polecenia:
Uruchom ś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.
Oto przykład konfiguracji 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
Oto przykład konfiguracji 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
}
}
}
Oto przykładowe polecenie generowania śledzenia transakcji SurfaceFlinger:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \