Użyj SQL, aby znaleźć konkretne stany w śladach Winscope Perfetto. Globalna przeglądarka Search w interfejsie Winscope umożliwia uruchamianie zapytań i wizualizowanie wyników w formie tabeli:
 
 
Rysunek 1. Karta Wyszukiwarka.
Przeglądarka Search umożliwia pisanie i uruchamianie niestandardowych zapytań SQL dotyczących śladów Perfetto. Możesz też uzyskać dostęp do ostatnich i zapisanych zapytań. Winscope udostępnia specjalistyczne widoki SQL, które pomagają przeszukiwać ślady SurfaceFlinger, transakcji, przejść i zrzutów ekranu.
We wszystkich widokach stosuj te konwencje:
- W przypadku kolumn - propertyi- flat_property:- Nazwy właściwości są zapisywane w formacie snake case, np. visible_regionfromLayerProto.
- Notacja kropkowa reprezentuje zagnieżdżone właściwości, np. - visible_region.rect.
- Pola powtarzane w - propertysą rozróżniane za pomocą nawiasów kwadratowych:- Na przykład w 2 instancjach pola powtarzanego - visible_region.rectpole- topjest reprezentowane przez- visible_region.rect[0].topi- visible_region.rect[1].top.
- Pola powtarzane w - flat_propertysą nierozróżnialne:- Na przykład w 2 instancjach powtarzanego pola - visible_region.rectpole- topjest reprezentowane przez- visible_region.rect.topw obu instancjach.
 
- Nazwy właściwości są zapisywane w formacie snake case, np. 
- W kolumnach - valuei- previous_valuewartoś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_key i display_value odpowiadają odpowiednio kolumnom widoku property, flat_property i value.
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 wiadomości 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 to liczba całkowita | 
| 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:
- Dane warstwy są w formacie LayerProto.
- Dane główne hierarchii są w formacie LayersSnapshotProto.
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 | 
| is_visible | Widoczność warstwy | 
| property | Nazwa właściwości uwzględniająca pola powtarzane | 
| flat_property | Nazwa usługi 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 usługi 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 widoczna jest warstwa - IME:- SELECT DISTINCT ts, layer_id, layer_name FROM sf_layer_search WHERE layer_name like 'IME%' AND is_visible=1
- Znajdź wszystkie klatki, w których warstwa - IMEma 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 - Wallpaperjest 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 wszystkie 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 argsz 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 argsz 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ść protokołu | 
| transaction_id | Identyfikator transakcji (jeśli jest dostępny) | 
| property | Nazwa właściwości uwzględniająca pola powtarzane | 
| flat_property | Nazwa usługi 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 argsz 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 argsz 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 typu transakcji:
- LAYER_ADDED: format- LayerCreationArgs
- LAYER_CHANGED: format- LayerState
- DISPLAY_ADDED: format- DisplayState
- DISPLAY_CHANGED: format- DisplayState
- 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 usługi 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 argsz tym przejściem. | 
| 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 | Moduł obsługi przejścia: pobieranie tłumaczenia z window_manager_shell_transition_handlers | 
| status | Stan przejścia: played,mergedlubaborted | 
| 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 handlerw tabeliwindow_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 usługi 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 przesuwa 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 argsz 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 argsz 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, '%');
Widok SQL menedżera okien
Dane proto WindowManager używają formatu hierarchicznego
WindowManagerServiceDumpProto. Możesz wyszukiwać właściwości dowolnego kontenera WindowManager, w tym:
- DisplayContentProto
- DisplayAreaProto
- TaskProto
- ActivityRecordProto
- WindowTokenProto
- WindowStateProto
- TaskFragmentProto
- WindowContainerProto
Aby wyszukać dane WindowManager, użyj widoku wm_search. Ten widok zawiera te kolumny:
| Kolumna | Opis | 
|---|---|
| state_id | Identyfikator wiersza stanu, do którego należy kontener | 
| ts | Sygnatura czasowa stanu, do którego należy kontener | 
| title | Tytuł kontenera | 
| token | Token kontenera | 
| parent_token | Token kontenera nadrzędnego | 
| is_visible | Widoczność kontenera | 
| property | Nazwa właściwości uwzględniająca pola powtarzane | 
| flat_property | Nazwa usługi 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, w których widoczny jest symbol - LauncherActivity:- SELECT DISTINCT ts, title, token FROM wm_search WHERE title like '%LauncherActivity%' AND is_visible=1
- Znajdź wszystkie stany, w których powierzchnia - Wallpapersię porusza:- SELECT ts, value, previous_value FROM wm_search WHERE title like '%Wallpaper%' AND property like '%surface_position%' AND value != previous_value
Tabele danych
Widok WindowManager jest tworzony na podstawie tych tabel:
android_windowmanager:
| Kolumna | Opis | 
|---|---|
| id | Identyfikator wiersza wpisu | 
| ts | Sygnatura czasowa wpisu | 
| arg_set_id | Identyfikator używany do powiązania wierszy z tabeli argsz tym wpisem. | 
android_windowmanager_windowcontainer:
| Kolumna | Opis | 
|---|---|
| id | Identyfikator wiersza kontenera | 
| snapshot_id | Identyfikator wiersza wpisu u dostawcy tożsamości android_windowmanager, do którego należy kontener | 
| arg_set_id | Identyfikator używany do powiązania wierszy z tabeli argsz tym widokiem. | 
Uruchamianie zapytań
Zapytania możesz wykonywać 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:
 
 
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 działaniem podobnym do przeglądarek śladów opartych na logach, takich jak Transakcje i ProtoLog:
 
 
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 poruszać się między wpisami:
 
 
Rysunek 4. Oś czasu wyszukiwania.
