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:
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
property
iflat_property
:- Nazwy właściwości są zapisywane w formacie snake case, np.
visible_region
fromLayerProto
. 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
poletop
jest reprezentowane przezvisible_region.rect[0].top
ivisible_region.rect[1].top
.Pola powtarzane w
flat_property
są nierozróżnialne:Na przykład w 2 instancjach powtarzanego pola
visible_region.rect
poletop
jest reprezentowane przezvisible_region.rect.top
w obu instancjach.
- Nazwy właściwości są zapisywane w formacie snake case, np.
W kolumnach
value
iprevious_value
wartości logiczne są reprezentowane przez0
(False
) lub1
(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 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:
Dane warstwy są w formacie
LayerProto
.Dane główne hierarchii mają format
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 |
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
formatLAYER_CHANGED
:LayerState
formatDISPLAY_ADDED
:DisplayState
formatDISPLAY_CHANGED
:DisplayState
formatLAYER_DESTROYED
: Brak argumentówLAYER_HANDLE_DESTROYED
: Brak argumentówDISPLAY_REMOVED
: Brak argumentówNOOP
: 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:
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:
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:
Rysunek 4. Oś czasu wyszukiwania.