Śledzić przejścia okien za pomocą Winscope

Winscope to narzędzie internetowe, które pozwala użytkownikom rejestrować, odtwarzać i analizować stany kilku usług systemowych podczas odtwarzania animacji i przejść oraz po ich zakończeniu. Winscope rejestruje wszystkie odpowiednie stany usługi systemowej w pliku śledzenia. Za pomocą interfejsu Winscope i pliku śladu możesz sprawdzić stan tych usług w przypadku każdego klatki animacji (z opcją nagrywania ekranu lub bez niej) przez odtwarzanie, przechodzenie do kolejnych kroków i debugowanie podczas przejść.

Usługi systemowe, które generują ślady, które można wczytać do Winscope:

  • SurfaceFlinger
  • Menedżer okien
  • WMShell
  • IME
  • Wyrzutnia

Uruchamianie narzędzia do wyświetlania śladów Winscope

Śledzenie Winscope jest częścią usług na platformie. W tej sekcji opisujemy czynności, które należy wykonać, aby pobrać, skompilować i uruchomić przeglądarkę logów czasu Winscope.

Aby skonfigurować komputer do uruchamiania narzędzia do śledzenia Winscope:

  1. Pobierz kod źródłowy Androida.
  2. Otwórz folder Winscope:

    cd development/tools/winscope
    
  3. Zainstaluj zależności za pomocą:

    npm install
    

    Aby wyświetlić listę dostępnych poleceń, uruchom: npm run

  4. Utwórz wszystkie produkcyjne i testowe środowiska docelowe za pomocą:

    npm run build:prod
    
  5. Uruchom Winscope za pomocą:

    npm run start
    

Rejestrowanie zrzutów

Logi możesz przechwytywać na urządzeniu, za pomocą Winscope lub Android Debug Bridge (adb).

Rejestrowanie dzienników na urządzeniu

Rejestruj ślady na urządzeniu, aby zbierać dane podczas zgłaszania błędów w przypadku problemów z animacją. Wszystkie ścieżki UI są rejestrowane za pomocą tej metody, ponieważ konfiguracji nie można dostosować.

Na urządzeniu z Androidem:

  1. Włącz opcje programisty.
  2. W sekcji Opcje programisty kliknij Śledzenie systemu.
  3. Włącz opcję Zbieraj ślady Winscope.
  4. W sekcji Inne:
    1. Włącz opcję Dołącz nagrania do raportów o błędach.
    2. Włącz Pokaż kafelek Szybkich ustawień.
  5. Przejdź do miejsca, w którym chcesz odtworzyć błąd.
  6. Aby rozpocząć nagrywanie, otwórz Szybkie ustawienia i wybierz Nagrywanie ścieżki:

    quick_setting_winscope

    Rysunek 1. Menu szybkich ustawień w narzędziu Record Trace (Rejestruj śledzenie).

  7. Wykonaj tylko kroki niezbędne do odtworzenia błędu.

  8. Aby zatrzymać przechwytywanie, otwórz Szybkie ustawienia i wybierz Zatrzymaj śledzenie.

  9. Udostępnij przechwycony dziennik, korzystając z jednego z wymienionych niżej sposobów, np. Gmaila, Dysku lub BetterBuga.

Rejestruj ślady za pomocą Winscope

Możesz tworzyć ścieżki za pomocą Winscope do programowania lokalnego i debugowania. Winscope używa adb, który obsługuje połączenie z urządzeniem przez USB lub Wi-Fi.

W Winscope:

  1. Na ekranie Collect Traces (Zbieraj logi czasu) kliknij ADB Proxy (Serwer proxy ADB):

    capture_traces_winscope

    Rysunek 2. rejestrować ślady w Winscope,

  2. Uruchom serwer proxy Winscope ADB Connect, aby rejestrować logi czasu bezpośrednio w przeglądarce.

  3. Uruchom polecenie:

    python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
    
  4. Aby rozpocząć przechwytywanie, na ekranie Zbieraj ścieżki wybierz cele i konfigurację, a potem kliknij Rozpocznij śledzenie:

    collect_traces_winscope

    Rysunek 3. Zbieraj ślady w Winscope.

  5. Aby zatrzymać przechwytywanie, kliknij Zakończ śledzenie:

    end_trace_winscope

    Rysunek 4. Zakończ śledzenie w Winscope.

Gdy narzędzie przesyła ślady do interfejsu Winscope, na ekranie pojawiają się komunikaty PobieranieAnalizowanie plików Proto.

Generowanie kopii stanu za pomocą narzędzia Winscope

Aby wykonać zrzut stanu za pomocą Winscope, na ekranie Collect Traces (Zbieraj logi czasu) wybierz kartę Zump (Zrzut), a następnie kliknij Dump state (Stan zrzutu):

dump-winscope

Rysunek 5. Stan zrzutu w Winscope.

Rejestrowanie dzienników za pomocą poleceń adb

Przed uruchomieniem poleceń adb shell dla każdego z tych logów czasu uruchom polecenie adb root. 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, przeczytaj artykuł Kopiowanie plików na urządzenie i z urządzenia. Więcej informacji znajdziesz w sekcji adb.

Ślady WindowManager

Aby przechwycić ślady WindowManager:

  • Włącz śledzenie:

    adb shell wm tracing start
    
  • Wyłączanie śledzenia:

    adb shell wm tracing stop
    
  • Zapisz dane logowania w pliku podczas przechwytywania logu czasu:

    adb shell wm tracing save-for-bugreport
    
  • Rejestrowanie ścieżki 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
    
  • Stan logu czasu wydruku:

    adb shell wm tracing status
    
  • Ustaw poziom logowania na critical (widoczne tylko okna z ograniczonymi informacjami), trim (wszystkie okna z niepełnymi informacjami) lub all (wszystkie okna i informacje):

    adb shell wm tracing level
    

ProtoLog

Poniższe polecenia są używane w systemie ProtoLog.

W procesie system_server:

  • Uruchom ProtoLog:

    adb shell cmd window logging start
    
  • Zatrzymaj 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 podanych 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:

  • Uruchom ProtoLog:

    adb shell dumpsys activity service SystemUIService WMShell
    

Śledzenie przejść

Do śledzenia przejść używa się tych poleceń:

W procesie system_server:

  • Rozpocznij śledzenie:

    adb shell cmd window shell tracing start
    
  • Zatrzymaj log czasu:

    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
    

edytor IME|edytor metody wprowadzania (tekstu)

Do śledzenia edytora metod wprowadzania (IME) używane są te polecenia:

  • Rozpocznij śledzenie metody wprowadzania (IM) dla klientów metody wprowadzania, usługi metody wprowadzania i usługi zarządzania metodą wprowadzania:

    adb shell ime tracing start
    
  • Rozpocznij śledzenie klientów IME, IMS i IMMS:

    adb shell ime tracing stop
    

Warstwy SurfaceFlinger

Śledzenie warstw SurfaceFlinger wykorzystuje do rejestrowania dane Perfetto. 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
        }
    }
}

Aby wygenerować śledzenie warstw SurfaceFlinger, zapoznaj się z tym przykładowym poleceniem:

adb shell -t perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Transakcje SurfaceFlinger

Funkcja śledzenia transakcji SurfaceFlinger wykorzystuje do przechwytywania Perfetto Traf. Informacje o konfiguracji znajdziesz w sekcji Konfiguracja śledzenia.

Zobacz przykład konfiguracji Perfetto na potrzeby aktywnego śledzenia w usłudze 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

Oto przykład konfiguracji perfetto do ciągłego śledzenia w przypadku SurfaceFlinger:

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ładowy sposób generowania śledzenia transakcji w aplikacji SurfaceFlinger:

    adb shell perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Generuj zrzut stanu za pomocą narzędzia adb

Winscope odczytuje migawkę stanów WindowManager i SurfaceFlinger z raportów o błędach. Raporty o błędach przechowują stany jako osobne pliki proto w folderze proto. Aby wygenerować zrzuty stanu za pomocą narzędzia adb, uruchom poniższe polecenia.

W przypadku WindowManagera:

adb exec-out dumpsys window --proto > window_dump.winscope

W przypadku SurfaceFlinger:

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

Analizowanie logów czasu

Aby debugować przejściowe i nieprawidłowe stany, które powodują problemy z animacją, Winscope agreguje różne pliki śledzone, umożliwia wyszukiwanie i wizualizację ramek oraz osi czasu, a także przedstawia spójne komunikaty protobuf. Analiza śladów w Winscope pomaga określić dokładną warstwę, ramkę i stan wystąpienia błędu.

Korzystanie z Winscope

Po zarejestrowaniu logów czasu przeanalizuj je w Winscope:

  1. Prześlij zapisane logi czasu za pomocą panelu po prawej stronie. Możesz usunąć przesłane logi czasu lub przesłać więcej logów czasu.

    przesyłanie_traces_winscope

    Rysunek 6. Przesyłanie śladów w Winscope.

  2. Aby wyświetlić zwizualizowane przesłane ścieżki, kliknij Wyświetl ścieżki. Karty każdego logu czasu są widoczne w górnym panelu okna. Jeśli przesłany plik zawiera odpowiednie ślady, na ekranie pojawi się widok śladu nagrywania ekranu.

    view_traces_winscope

    Rysunek 7. Wyświetlanie śladów w Winscope.

    Użyj interfejsu w najwyższym panelu okna, aby zmienić nazwę edytuj_nazwę, pobrać przesłany ślad śledzenie_pobieranialub przesłać nowy.

  3. Możesz przeglądać logi czasu na przestrzeni czasu za pomocą suwaka czasu w dolnym panelu okna. Aby ułatwić sobie poruszanie się po czasie, użyj tych funkcji, jak pokazano na Rys. 8:

    • Aby przejść do określonego czasu lub zdarzenia, użyj kursora (suwaka czasu), strzałki w lewo czas_strzałki_w_lewo i w prawo arrow_right_time w polu wyświetlania czasu (w lewym dolnym rogu) lub strzałek w lewo i w prawo na klawiaturze.
    • Aby wyświetlić wybrane ścieżki z kolorami na osi czasu, użyj menu (po lewej stronie suwaka czasu). Domyślnie na osi czasu wyświetlane są 3 ostatnie logi czasu wyświetlone na kartach logu czasu.
    • Aby uzyskać szczegółowy widok wszystkich przesłanych logów czasu, użyj narzędzia Powiększ czas_powiększenia lub Pomniejsz zoom_out_time (pod suwakiem czasu) albo przewiń klawiaturę. Przycisk resetowania pozwala zresetować poziom powiększenia.
    • Aby wyświetlić rozkład rozkładu sygnału w czasie, kliknij strzałkę arrow_up_time w prawym dolnym rogu.

    time_nav_winscope

    Rysunek 8. Nawigacja w czasie w Winscope.

    W widoku rozszerzonym (ryc. 9) wybierz konkretne przedziały czasu i powiększ je, aby dokładniej je obejrzeć:

    expand_time_winscope

    Rysunek 9. Rozwinięta oś czasu w Winscope

  4. Aby zbadać logi czasu, możesz wyświetlić stan urządzenia za pomocą nagrania ekranu. Aby sprawdzić konkretny ślad, kliknij odpowiednią kartę śladu w górnym panelu narzędzia.

    • W przypadku logu Surface Flinger 3 panele wyświetlają różne widoki logu czasu w danym okresie, jak widać na rys. 10: sf_trace

      Rysunek 10. Śledzenie SurfaceFlinger w Winscope.

      • Widok Warstwy: widok 3D warstw w prostokątnych nakładkach. Te elementy interfejsu dostosowują prostokąty do renderowania elementów graficznych pod względem ich położenia, rozmiaru, transformacji i kolejności Z:

        • Suwak Obrót (w lewym górnym rogu widoku Warstwy) obraca wielowarstwowe prostokąty, umożliwiając ich wyświetlanie pod wybranymi kątami.
        • Suwak Odstępy (w prawym górnym rogu widoku Warstwy) dostosowuje odstępy między warstwami, aby utworzyć wybrany widok złożony.
        • Narzędzia powiększania (w prawym górnym rogu widoku warstw) umożliwiają powiększaniezoom_in_time i pomniejszanie zoom_out_time warstw, aby można było je dokładniej obejrzeć.
        • Przycisk resetowania reset_sf (w prawym górnym rogu widoku Warstwy) przywraca ustawienia aparatu do pierwotnego widoku.
        • Przeciągnij prostokąty, aby ułatwić powiększanie.
      • Widok Hierarchia: pełna hierarchia warstw.

        • Tylko widoczne (w prawym górnym rogu widoku hierarchii) – po wybraniu opcji ukrywa niewidzialne warstwy z hierarchii, aby ułatwić wizualizację elementów na ekranie.
        • Płaski (w prawym górnym rogu widoku hierarchii) – po wybraniu wyświetla hierarchię jako spłaszoną listę warstw.
        • Opcja Pokaż różnice (w lewym górnym rogu widoku hierarchii) jest wybrana tylko wtedy, gdy występuje zmiana stanu. Po wybraniu tej opcji narzędzie porównuje bieżący stan z poprzednim. Nowy element jest wyróżniony na zielono, usunięty element jest – na czerwono, a zmodyfikowany – niebieski.
      • Widok Właściwości: właściwości wybranej warstwy. Górny panel widoku Właściwości zawiera informacje tylko o kluczowych właściwościach, takich jak Widoczność, GeometriaBufor. Dolny panel widoku Właściwości zawiera zrzut protokołu wszystkich właściwości.

        • Pole wyboru Pokaż różnice (w lewym górnym rogu widoku Właściwości) działa tak samo jak w widoku Hierarchia.
        • Pokaż wartości domyślne (w lewym górnym rogu widoku Właściwości) – po wybraniu tej opcji w pliku Proto Dump będą wyświetlane wartości domyślne proto. Domyślnie te wartości nie są wymienione w pliku Proto Dump. Domyślne wartości proto są pobierane z definicji pola proto. Jeśli pole proto nie ma ustawionej wartości domyślnej innej niż null, wyświetlane są domyślne wartości proto:
          • Ciągi znaków: null
          • Liczby: 0
          • Wartości logiczne: False
          • Obiekty: null

      Wybór między tymi 3 widokami a nagrywaniem ekranu jest zsynchronizowany, co oznacza, że wszystkie ślady są aktualizowane synchronicznie po przejściu do innego punktu w czasie. Aby zobaczyć właściwości warstwy, zaznacz ją, klikając ją w widoku hierarchii lub klikając odpowiedni prostokąt w widoku Właściwości. Fioletowy prostokąt oznacza, że do danej warstwy jest dołączony ślad wyświetlenia. Po kliknięciu dwukrotnie fioletowej warstwy interfejs przejdzie do odpowiedniej karty śledzenia.

    • W przypadku śledzenia Window Manager 3 panele wyświetlają różne widoki ścieżki w określonym przedziale czasu, jak pokazano na rysunku 11:

      • Widok Windows: widok warstw 3D.
      • Widok Hierarchia: pełna hierarchia warstw.
      • Widok Usługi zawiera Proto Dump wszystkich usług.

      Wybór między 3 widokami a nagraniem ekranu jest zsynchronizowany, co oznacza, że wszystkie ścieżki są aktualizowane synchronicznie, gdy przechodzisz do innego punktu w czasie.

      wm_trace

      Rysunek 11. Śledzenie Menedżera okien w Winscope

    • W przypadku śladów Transaction transakcje między SurfaceFlinger i Window Manager są prezentowane w formacie tabeli, który można przeszukiwać za pomocą wyświetlanych identyfikatorów, typu i tekstu, wraz z widokiem właściwości, w którym jest widoczny zrzut proto. Synchronizacja pomiędzy dwoma widokami:

      transaction_trace

      Rysunek 12. Śledzenie transakcji w Winscope.

    • W przypadku logów czasu ProtoLog informacje są prezentowane w formie tabeli, którą można przeszukiwać według tagów, plików źródłowych i tekstu:

      protolog_trace

      Rysunek 13. Ślad ProtoLog w Winscope.

    • W przypadku logów czasu przejścia wyświetlana jest lista przejść z identyfikatorem, typem, czasem wysłania, czasem trwania i stanem, a także właściwościami wybranego przejścia:

      ślady_przejścia

      Rysunek 14. Zrzut przejść w Winscope.