Wyszukiwanie w logach czasu

Użyj SQL, aby znaleźć konkretne stany w śladach Winscope Perfetto. Użyj globalnego narzędzia Search w interfejsie Winscope, aby uruchamiać zapytania i wyświetlać wyniki w formie tabeli:

karta wyświetlająca wyszukiwanie,

Rysunek 1. Karta Wyszukiwarka.

Przeglądarka Search umożliwia pisanie i uruchamianie niestandardowych zapytań SQL dotyczących śladów Perfetto, a także dostęp do ostatnich i zapisanych zapytań. Winscope udostępnia specjalistyczne widoki SQL, które ułatwiają wyszukiwanie śladów SurfaceFlinger, transakcji, przejść i przechwytywania widoków.

We wszystkich widokach stosuj te konwencje:

  • W przypadku kolumn propertyflat_property:

    • Nazwy właściwości są zapisywane w formacie snake case, np. visible_region from LayerProto.
    • Notacja kropkowa reprezentuje zagnieżdżone właściwości, np.visible_region.rect.

    • Pola powtarzane w property są rozróżniane za pomocą nawiasów kwadratowych:

      Na przykład w 2 instancjach pola powtarzanego visible_region.rect pole top jest reprezentowane przez visible_region.rect[0].topvisible_region.rect[1].top.

    • Pola powtarzane w flat_property są nierozróżnialne:

      Na przykład w 2 instancjach powtarzanego pola visible_region.rect pole top jest reprezentowane przez visible_region.rect.top w obu instancjach.

  • W kolumnach valueprevious_value wartości logiczne są reprezentowane przez 0 (False) lub 1 (True).

Winscope tworzy te widoki, łącząc dane z tabel specyficznych dla śledzenia z tabelą Perfetto.args Możesz bezpośrednio wysyłać zapytania do tych tabel. W tabeli args kolumny key, flat_keydisplay_value odpowiadają odpowiednio kolumnom widoku property, flat_propertyvalue.

args tabela:

Kolumna Opis
arg_set_id Służy do powiązania zestawu argumentów.
flat_key Nazwa właściwości z komunikatu protokołu, bez uwzględnienia pól powtarzanych
key Nazwa właściwości z komunikatu protokołu z uwzględnieniem pól powtarzanych
value_type Typ wartości właściwości
int_value Wartość właściwości, jeśli typ wartości jest liczbą całkowitą
string_value Wartość właściwości, jeśli typ wartości to ciąg znaków
real_value Wartość właściwości, jeśli typ wartości to liczba rzeczywista
display_value Wartość właściwości przekształcona w ciąg znaków

Widoki SQL usługi SurfaceFlinger

Dane protokołu SurfaceFlinger są zapisywane w tych formatach:

Aby wyszukać dane warstwy, użyj widoku sf_layer_search. Ten widok zawiera te kolumny:

Kolumna Opis
state_id Identyfikator wiersza wpisu, do którego należy warstwa
ts Sygnatura czasowa wpisu, do którego należy warstwa.
layer_id Identyfikator warstwy
parent_id Identyfikator warstwy elementu nadrzędnego
layer_name Nazwa warstwy
property Nazwa właściwości uwzględniająca pola powtarzane
flat_property Nazwa właściwości nie uwzględnia powtarzanych pól
value Wartość właściwości w formacie ciągu znaków
previous_value Wartość właściwości z poprzedniego wpisu w formacie ciągu znaków.

Aby wyszukać dane główne hierarchii, użyj widoku sf_hierarchy_root_search. Ten widok zawiera te kolumny:

Kolumna Opis
state_id Identyfikator wiersza wpisu
ts Sygnatura czasowa wpisu
property Nazwa właściwości uwzględniająca pola powtarzane
flat_property Nazwa właściwości nie uwzględnia powtarzanych pól
value Wartość właściwości w formacie ciągu znaków
previous_value Wartość właściwości z poprzedniego wpisu w formacie ciągu znaków.

Przykładowe zapytania

  • Znajdź wszystkie klatki, w których warstwa IME ma prawidłowe granice ekranu:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Znajdź wszystkie klatki, w których zmienia się warstwa Taskbar color.a (alfa):

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Znajdź wszystkie klatki, w których dolna granica Wallpaper jest mniejsza lub równa 2400:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • Wyświetl listę wszystkich właściwości wyświetlaczy z prawidłowym stosem warstw:

    SELECT STATE.* FROM sf_hierarchy_root_search STATE_WITH_DISPLAY_ON
    INNER JOIN sf_hierarchy_root_search STATE
      ON STATE.state_id = STATE_WITH_DISPLAY_ON.state_id
      AND STATE_WITH_DISPLAY_ON.flat_property='displays.layer_stack'
      AND STATE_WITH_DISPLAY_ON.value!='4294967295'
      AND STATE.property LIKE CONCAT(
        SUBSTRING(
            STATE_WITH_DISPLAY_ON.property,
            0,
            instr(STATE_WITH_DISPLAY_ON.property, ']')
        ),
        '%'
      )
    
  • Znajdź wszystkie klatki, w których widać gest cofania

    SELECT DISTINCT STATE.ts FROM sf_layer_search STATE
      WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
    

Tabele danych

Widoki SurfaceFlinger są tworzone na podstawie tych tabel:

surfaceflinger_layers_snapshot:

Kolumna Opis
id Identyfikator wiersza wpisu
ts Sygnatura czasowa wpisu
arg_set_id Identyfikator używany do powiązania wierszy z tabeli args z tym wpisem.

surfaceflinger_layer:

Kolumna Opis
id Identyfikator wiersza warstwy
snapshot_id Identyfikator wiersza wpisu z surfaceflinger_layers_snapshot, do którego należy warstwa
arg_set_id Identyfikator używany do powiązania wierszy z tabeli args z tą warstwą.

Widok SQL transakcji

Dane protokołu transakcji są zapisywane w formacie TransactionTraceEntry.

Aby wyszukać dane śledzenia transakcji, użyj widoku transactions_search. Ten widok zawiera te kolumny:

Kolumna Opis
state_id Identyfikator wiersza wpisu, do którego należy właściwość protokołu
ts Sygnatura czasowa wpisu, do którego należy właściwość proto
transaction_id Identyfikator transakcji (jeśli jest dostępny)
property Nazwa właściwości uwzględniająca pola powtarzane
flat_property Nazwa właściwości nie uwzględnia powtarzanych pól
value Wartość właściwości w formacie ciągu znaków

Przykładowe zapytania

  • Znajdź klatkę, w której zastosowano transakcję, aby zmienić pozycję warstwy x na -54,0:

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • Znajdź klatkę, w której dodano warstwę ImeContainer:

    SELECT ts FROM transactions_search
      WHERE flat_property='added_layers.name'
      AND value='ImeContainer'
    

Tabele danych

Widok SQL transakcji jest tworzony na podstawie tych tabel:

surfaceflinger_transactions:

Kolumna Opis
id Identyfikator wiersza wpisu
ts Sygnatura czasowa wpisu
arg_set_id Identyfikator używany do powiązania wierszy z tabeli args z tym wpisem.
vsync_id Identyfikator VSync powiązany ze wszystkimi transakcjami w tym wpisie

android_surfaceflinger_transaction:

Kolumna Opis
id Identyfikator wiersza transakcji
snapshot_id Identyfikator wiersza wpisu z surfaceflinger_transactions, do którego należy transakcja
arg_set_id Identyfikator używany do powiązania wierszy z tabeli args z tą transakcją.
transaction_id Identyfikator transakcji pobrany z wiadomości protokołu
pid Identyfikator PID transakcji pobrany z wiadomości proto
uid Identyfikator transakcji pobrany z wiadomości proto
layer_id Identyfikator warstwy powiązanej z transakcją (w odpowiednich przypadkach)
display_id Identyfikator wyświetlacza powiązanego z transakcją (w odpowiednich przypadkach)
flags_id Identyfikator używany do pobierania powiązanych flag z android_surfaceflinger_transaction_flag
transaction_type Typ transakcji

android_surfaceflinger_transaction_flag:

Kolumna Opis
flags_id Odpowiada wartości w wierszu w android_surfaceflinger_transaction
flag Przetłumaczony ciąg flagi

Poszczególne transakcje są dodawane do tabeli argumentów z różnych formatów wiadomości protokołu w zależności od ich typu:

  • LAYER_ADDED: LayerCreationArgs format
  • LAYER_CHANGED: LayerState format
  • DISPLAY_ADDED: DisplayState format
  • DISPLAY_CHANGED: DisplayState format
  • LAYER_DESTROYED: Brak argumentów
  • LAYER_HANDLE_DESTROYED: Brak argumentów
  • DISPLAY_REMOVED: Brak argumentów
  • NOOP: Brak argumentów

Widok SQL przejść

Dane protokołu przejść są zapisywane w formacie ShellTransition.

Aby wyszukać dane o przejściach, użyj widoku transitions_search. Ten widok zawiera te kolumny:

Kolumna Opis
ts Czas wysyłki; jeśli jest dostępny, przyjmuje wartość czasu wysłania, w przeciwnym razie 0
transition_id Identyfikator przejścia pobrany z wiadomości protokołu
property Nazwa właściwości uwzględniająca pola powtarzane
flat_property Nazwa właściwości nie uwzględnia powtarzanych pól
value Identyfikator transakcji pobrany z wiadomości proto

Przykładowe zapytania

Znajdź właściwości przejść obsługiwanych przez DefaultMixedHandler:

  SELECT
    PROPS.ts,
    PROPS.transition_id,
    PROPS.property,
    PROPS.value
  FROM transitions_search HANDLER_MATCH
  INNER JOIN transitions_search PROPS
    ON HANDLER_MATCH.transition_id = PROPS.transition_id
  WHERE HANDLER_MATCH.property = 'handler'
    AND HANDLER_MATCH.value LIKE "%DefaultMixedHandler"
  ORDER BY PROPS.transition_id, PROPS.property

Tabele danych

Widok Przejścia jest tworzony na podstawie tych tabel:

window_manager_shell_transitions:

Kolumna Opis
id Identyfikator wiersza przejścia
ts Czas wysyłki; jeśli jest dostępny, przyjmuje wartość czasu wysłania, w przeciwnym razie 0
transition_id Identyfikator przejścia pobrany z wiadomości protokołu
arg_set_id Identyfikator używany do powiązania wierszy z tabeli args z tą zmianą stanu
transition_type Typ przejścia pobrany z wiadomości protokołu
send_time_ns Czas wysłania przejścia pobrany z wiadomości protokołu
dispatch_time_ns Czas wysyłki przejścia pobrany z wiadomości protokołu
duration_ns czas trwania przejścia, jeśli dostępne są godziny rozpoczęcia i zakończenia;
handler Obsługa przejścia: pobieranie tłumaczenia z window_manager_shell_transition_handlers
status Stan przejścia: played, merged lub aborted
flags Flagi przejścia pobrane z wiadomości protokołu

window_manager_shell_transition_handlers:

Kolumna Opis
handler_id Identyfikator odpowiadający wartości w kolumnie handler w pliku window_manager_shell_transitions
handler_name Tłumaczenie ciągu znaków

android_window_manager_shell_transition_participants:

Kolumna Opis
transition_id Identyfikator przejścia pobrany z nieprzetworzonej wiadomości protokołu
layer_id Identyfikator uczestnika warstwy SurfaceFlinger
window_id Identyfikator uczestnika kontenera WindowManager

Widok SQL ViewCapture

Dane protokołu ViewCapture są zapisywane w formacie View.

Aby wyszukać dane ViewCapture, użyj widoku viewcapture_search. Ten widok zawiera te kolumny:

Kolumna Opis
state_id Identyfikator wiersza stanu, do którego należy widok
ts Sygnatura czasowa stanu, do którego należy widok
package_name Nazwa pakietu
window_name Nazwa okna
class_name Wyświetlanie nazwy zajęć
property Nazwa właściwości uwzględniająca pola powtarzane
flat_property Nazwa właściwości nie uwzględnia powtarzanych pól
value Wartość właściwości w formacie ciągu znaków
previous_value Wartość właściwości z poprzedniego stanu w formacie ciągu znaków.

Przykładowe zapytania

Znajdź wszystkie stany, gdy SearchContainerView porusza się w kierunku osi Y:

  SELECT * FROM viewcapture_search
  WHERE class_name LIKE '%SearchContainerView'
    AND flat_property='translation_y'
    AND value!=previous_value

Tabele danych

Widok ViewCapture jest tworzony na podstawie tych tabel:

android_viewcapture:

Kolumna Opis
id Identyfikator wiersza wpisu
ts Sygnatura czasowa wpisu
arg_set_id Identyfikator używany do powiązania wierszy z tabeli args z tym wpisem.

android_viewcapture_view:

Kolumna Opis
id Identyfikator wiersza widoku
snapshot_id Identyfikator wiersza wpisu z android_viewcapture, do którego należy widok
arg_set_id Identyfikator używany do powiązania wierszy z tabeli args z tym widokiem.

Tabela SQL ProtoLog

Dane protokołu ProtoLog są zapisywane w formacie ProtoLogMessage. Ten widok zawiera te kolumny:

Kolumna Opis
ts Sygnatura czasowa dziennika
level Poziom logu
tag Tag grupy rejestrowania
message Komunikat logu
stacktrace Zrzut stosu (jeśli jest dostępny)
location Lokalizacja kodu, z której pochodzi wiadomość

Przykładowe zapytania

  • Znajdź wszystkie logi z wiadomością zawierającą transition:

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • Znajdź wszystkie logi zawierające prawidłowe identyfikatory transakcji:

    CREATE PERFETTO VIEW valid_tx_ids AS
      SELECT DISTINCT transaction_id FROM transactions_search
      WHERE transaction_id IS NOT NULL AND transaction_id != '0';
    
    SELECT TRANS.transaction_id, message FROM valid_tx_ids TRANS
    INNER JOIN protolog LOGS
      ON LOGS.message LIKE CONCAT('%', TRANS.transaction_id, '%');
    

Uruchamianie zapytań

Zapytania możesz uruchamiać w panelu GLOBAL SEARCH po lewej stronie przeglądarki Search.

Gdy po raz pierwszy otworzysz panel GLOBAL SEARCH, śledzenie wyszukiwania zostanie zainicjowane, a Winscope utworzy pomocnicze widoki SQL. Zajmie to kilka sekund. Podczas inicjowania wyszukiwania śladu oś czasu jest niedostępna.

Aby rozpocząć zapytanie, wpisz je w polu wyszukiwania i kliknij Uruchom zapytanie lub naciśnij Enter na klawiaturze.

Po zakończeniu w panelu środkowym pojawi się tabela wyników. Zapytanie pojawi się pod polem wyszukiwania wraz z polem, w którym możesz zapisać zapytanie między sesjami.

Zapisane zapytania możesz wyświetlić, klikając kartę Zapisane w panelu po lewej stronie, a ostatnio uruchomione zapytania – klikając kartę Ostatnie:

wyszukiwanie w panelu po lewej stronie przeglądarki,

Rysunek 2. Wyszukiwanie w lewym panelu przeglądarki.

Wyniki

Wszystkie zapytania zwracają wyniki w formie tabeli, które są wyświetlane w widoku z możliwością przewijania i interaktywnym zachowaniem podobnym do przeglądarek śladów opartych na logach, takich jak Transakcje i ProtoLog:

wyniki wyszukiwania przeglądarki,

Rysunek 3. Wyniki wyszukiwania w przeglądarce.

Jeśli wynikowa tabela zawiera kolumnę ts, wartości w tej kolumnie są interpretowane jako sygnatury czasowe i dodawane do nakładki osi czasu jako nowy wiersz wpisów. Kliknij ten wiersz i użyj klawiszy strzałek w lewo i w prawo, aby przechodzić między wpisami:

oś czasu wyszukiwania,

Rysunek 4. Oś czasu wyszukiwania.