Rejestrowanie dzienników za pomocą poleceń adb

Ścieżki Winscope można zbierać za pomocą wiersza poleceń adb w wersjach debugowania (czyli w wersjach userdebugeng). 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 pliku group_overrides.
  • ENABLE_ALL: śledzi wszystkie grupy i poziomy logowania, chyba że jest to określone w opcji group_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 co default_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 artykule android_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 co MODE_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) lub all (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 \