Ścieżki Winscope można zbierać za pomocą wiersza poleceń adb
w wersjach debugowania (czyli w wersjach userdebug
i eng
). Zanim zaczniesz zbierać ślady Winscope za pomocą adb
, uruchom adb root
.
Począwszy od Androida 15 ścieżki Winscope są zintegrowane z Perfetto i zbierane za pomocą wiersza poleceń Perfeto. Każdy ślad Winscope to źródło danych Perfetto z własną konfiguracją. Konfiguracje możesz włączać pojedynczo lub w ramach jednej sesji śledzenia.
W Androidzie 14 i starszych każde śledzenie Winscope ma inne polecenie i możesz je zbierać niezależnie. Więcej informacji znajdziesz w artykule Zapisywanie dzienników na Androidzie 14 i starszych.
WindowManager
W przypadku tego typu śledzenia użyj nazwy źródła danych android.windowmanager
.
Opcje konfiguracji
Poziom rejestrowania (
log_level
): określa szczegółowość logowania. 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 konfiguracji.LOG_LEVEL_CRITICAL
: rejestruje tylko widoczne elementy, co minimalizuje obciążenie wydajnościowe.
Częstotliwość logowania (
log_frequency
): określa częstotliwość, z jaką elementy są rejestrowane:LOG_FREQUENCY_FRAME
: śledzi zrzuty stanu po zaakceptowaniu ramki.LOG_FREQUENCY_TRANSACTION
: śledzi zrzuty stanu za każdym razem, gdy transakcja jest zatwierdzana.LOG_FREQUENCY_SINGLE_DUMP
: śledzi zrzuty pojedynczego stanu po uruchomieniu źródła danych.
Szczegółowe informacje o wartościach konfiguracji znajdziesz w obiekcie WindowManager.
Przykład
Poniżej znajdziesz przykład typu śladu WindowManager 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.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
EOF
ProtoLog
W przypadku tego typu śledzenia użyj nazwy źródła danych android.protolog
.
Opcje konfiguracji
Tryb śledzenia (tracing_mode
): określa konfigurację logów do użycia:
DEFAULT
: śledzi tylko grupy i poziomy logowania określone w plikugroup_overrides
.ENABLE_ALL
: śledzi wszystkie grupy i poziomy logowania, chyba że jest to określone w opcjigroup_overrides
.
Minimalny poziom logowania (default_log_from_level
): jeśli ta opcja jest ustawiona, wszystkie komunikaty o poziomie logowania wyższym lub równym temu poziomowi są śledzone, chyba że określono zastąpienie grupy. Jest to na przykład używane do rejestrowania wszystkich ostrzeżeń i błędów bez konieczności włączania wszystkich dziennikó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 grupowe (group_overrides
): umożliwiają 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 dotyczy tylko bieżącej grupy.collect_stacktrace
: gdy jest ustawiona wartośćtrue
, zbiera ślad stosu dla każdej wiadomości ProtoLog w grupie, która jest śledzona.
Przykład
Oto przykład typu śledzenia ProtoLog 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.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 śledzenia użyj nazwy źródła danych android.input.inputevent
.
Opcje konfiguracji
Tryb śledzenia (trace_mode
): określa, czy śledzenie danych wejściowych ma być uruchamiane przy użyciu reguł ochrony prywatności, czy też ma rejestrować wszystkie zdarzenia związane z danymi wejściowymi:
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
: do określania, które zdarzenia mają być śledzone, używa reguł śledzenia zdefiniowanych w tym pliku konfiguracyjnym. Więcej informacji o określaniu reguł dla śledzenia znajdziesz w artykuleandroid_input_event_config.proto
.
Przykład
Oto przykład typu ścieżki wejściowej 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 śledzenia użyj nazwy źródła danych android.surfaceflinger.layers
.
Opcje konfiguracji
Tryb śledzenia (mode
): określa częstotliwość rejestrowania elementów:
MODE_ACTIVE
: śledzi zrzuty warstw. Każda zmiana warstw powoduje utworzenie migawki.MODE_GENERATED
: generuje zrzuty warstw na podstawie transakcji przechowywanych w wewnętrznym buforze pierścieniowym SurfaceFlingera. Tworzenie przez warstwę jej migawek odbywa się, gdy to źródło danych zostanie wyczyszczone.MODE_DUMP
: śledzi zrzut pojedynczej warstwy.MODE_GENERATED_BUGREPORT_ONLY
: to samo coMODE_GENERATED
, ale powoduje generowanie przez warstwy migawek tylko wtedy, gdy zostanie przesłane zgłoszenie błędu, a nie zawsze, gdy nastąpi wyczyszczenie ścieżki.
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 obszar.TRACE_FLAG_EXTRA
: śledzi dodatkowe metadane powierzchni, w tym warstwy poza ekranem.TRACE_FLAG_HWC
: śledzi dodatkowe nieuporządkowane metadane komponowania sprzętowego.TRACE_FLAG_BUFFERS
: skonfiguruj SurfaceFlinger, aby śledził wszystkie zmiany bufora na powierzchni. Domyślnie SurfaceFlinger śledzi nowy stan tylko wtedy, gdy występują zmiany geometrii.TRACE_FLAG_VIRTUAL_DISPLAYS
: zawiera w śladzie wirtualne warstwy wyświetlania.
Przykład
Oto przykład typu śladu 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 narzędziu SurfaceFlinger.
Przejścia w muszli
W przypadku tego typu ścieżki użyj nazwy źródła danych com.android.wm.shell.transition
.
Opcje konfiguracji
Ten typ śledzenia nie ma opcji konfiguracji.
Przykład
Oto przykład typu śladu przejścia powłoki 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: "com.android.wm.shell.transition"
}
}
EOF
SurfaceFlinger (transakcje)
W przypadku tego typu śledzenia użyj nazwy źródła danych android.surfaceflinger.transactions
.
Opcje konfiguracji
Tryb śledzenia (mode
): określa częstotliwość rejestrowania elementów:
MODE_CONTINUOUS
: SurfaceFlinger zapisuje swój wewnętrzny bufor pierścienikowy transakcji za każdym razem, gdy źródło danych zostanie opróżnione. Pierścień buforowy zawiera początkowy stan SurfaceFlingera i najnowsze transakcje.MODE_ACTIVE
: usługa SurfaceFlinger zapisuje stan początkowy, a potem każdą przychodzącą transakcję, aż do zatrzymania źródła danych.
Przykład
Oto przykład typu śladu transakcji SurfaceFlinger w 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 śledzenia użyj nazwy źródła danych: android.inputmethod
.
Opcje konfiguracji
Ten typ śledzenia nie ma opcji konfiguracji.
Przykład
Oto przykład typu ścieżki IME 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.inputmethod"
}
}
EOF
ViewCapture
W przypadku tego typu śledzenia 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 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
Peretto umożliwia zbieranie danych z wielu źródeł w ramach jednej konfiguracji. Możesz zebrać wszystkie ślady Winscope 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 zrzutów na Androidzie 14 i starszych
Przed wykonaniem poleceń adb root
w przypadku każdego z tych wiązek wykonaj polecenie adb root
.adb shell
Po zakończeniu śledzenia pliki śledzenia są dostępne w folderze /data/misc/wmtrace
. Aby skopiować plik lub katalog wraz z podkatalogami 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łączanie śledzenia:
adb shell wm tracing start
Wyłączanie śledzenia:
adb shell wm tracing stop
Zapisywanie danych logowania w pliku podczas wykonywania przechwytywania śladów:
adb shell wm tracing save-for-bugreport
Rejestrowanie śladu raz na klatkę:
adb shell wm tracing frame
Rejestrowanie każdej transakcji:
adb shell wm tracing transaction
Ustaw maksymalny rozmiar dziennika (w KB):
adb shell wm tracing size
Wydrukuj stan śledzenia:
adb shell wm tracing status
Ustaw poziom dziennika na
critical
(tylko widoczne okna z ograniczoną ilością informacji),trim
(wszystkie okna z ograniczoną ilością informacji) luball
(wszystkie okna i informacje):adb shell wm tracing level
Dumpy WindowManager
Aby uzyskać zrzuty dzienników WindowManager:
adb exec-out dumpsys window --proto > window_dump.winscope
ProtoLog
W systemie ProtoLog używane są te polecenia:
W trakcie procesu system_server
:
Uruchamianie ProtoLog:
adb shell cmd window logging start
Zatrzymanie ProtoLog:
adb shell cmd window logging stop
Włącz ProtoLog dla podanych grup logów:
adb shell cmd window logging enable [group...]
Wyłącz ProtoLog dla podanych grup logów:
adb shell cmd window logging disable [group...]
Włącz logowanie Logcata dla tych grup logów:
adb shell cmd window logging enable-text [group...]
Wyłącz logowanie Logcata dla podanych grup logów:
adb shell cmd window logging disable-text [group...]
W WMShell:
Uruchamianie ProtoLog:
adb shell dumpsys activity service SystemUIService WMShell
Ścieżki SurfaceFlinger (warstwy)
Śledzenie warstwy SurfaceFlinger korzysta z wykresu Perfetto do przechwytywania. Informacje o konfiguracji znajdziesz w sekcji Konfiguracja ścieżki.
Poniżej znajdziesz przykład konfiguracji śledzenia warstwy za pomocą 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żej znajdziesz przykładowy kod polecenia służący do generowania śladów dla warstw SurfaceFlinger:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
Dane wyjściowe SurfaceFlinger (warstwy)
Aby uzyskać zrzuty SurfaceFlinger:
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
Przejścia w muszli
Do śledzenia przejść używa się tych poleceń.
W procesie system_server
:
Rozpoczęcie śledzenia:
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 za pomocą edytora metody wprowadzania (IME) służą te polecenia:
Rozpocznij śledzenie metody wprowadzania (IM) dla klientów metody wprowadzania, 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 korzysta z wykresu Perfetto do rejestrowania. Informacje o konfiguracji znajdziesz w sekcji Konfiguracja ścieżki.
Oto przykład konfiguracji Perfetta do aktywnego śledzenia w przypadku 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
Poniżej znajdziesz przykład konfiguracji Perfectto dla SurfaceFlingera w ramach ciągłego śledzenia:
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żej znajdziesz przykładowe polecenie służące do generowania śledzonych transakcji aplikacji SurfaceFlinger:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \