Trace-Suche

Sie können SQL verwenden, um bestimmte Status in Winscope Perfetto-Traces zu finden. Um Abfragen auszuführen und tabellarische Ergebnisse zu visualisieren, verwenden Sie den globalen Viewer Search in der Winscope-Benutzeroberfläche:

Viewer-Tab „Search“

Abbildung 1: Viewer-Tab „Search“

Im Viewer Search können Sie benutzerdefinierte SQL-Abfragen für Perfetto-Traces schreiben und ausführen sowie auf aktuelle und gespeicherte Abfragen zugreifen. Winscope bietet spezielle SQL-Ansichten, die bei der Suche nach SurfaceFlinger-, Transaktions-, Übergangs- und ViewCapture-Traces helfen.

Verwenden Sie für alle Ansichten die folgenden Konventionen:

  • Für die Spalten property und flat_property:

    • Eigenschaftsnamen werden in Snake Case geschrieben, z. B. visible_region von LayerProto.
    • Eine Punktnotation steht für verschachtelte Eigenschaften, z. B. visible_region.rect.

    • Wiederkehrende Felder in property werden durch eckige Klammern gekennzeichnet:

      In zwei Instanzen des wiederkehrenden Felds visible_region.rect wird das Feld top beispielsweise durch visible_region.rect[0].top und visible_region.rect[1].top dargestellt.

    • Wiederkehrende Felder in flat_property sind nicht unterscheidbar:

      In zwei Instanzen des wiederkehrenden Felds visible_region.rect wird das Feld top beispielsweise in beiden Instanzen durch visible_region.rect.top dargestellt.

  • In value- und previous_value-Spalten werden boolesche Werte durch 0 (False) oder 1 (True) dargestellt.

Winscope erstellt diese Ansichten, indem Daten aus sitzungsspezifischen Tabellen mit der Perfetto-Tabelle args zusammengeführt werden. Sie können diese Tabellen direkt abfragen. In der Tabelle args entsprechen die Spalten key, flat_key und display_value den Ansichtsspalten property, flat_property und value.

args-Tabelle:

Spalte Beschreibung
arg_set_id Wird verwendet, um eine Reihe von Argumenten zu verknüpfen.
flat_key Eigenschaftsname aus der Proto-Nachricht, wobei wiederkehrende Felder nicht berücksichtigt werden
key Eigenschaftsname aus der Proto-Nachricht, unter Berücksichtigung wiederkehrender Felder
value_type Eigenschaftswerttyp
int_value Eigenschaftswert, wenn der Werttyp eine Ganzzahl ist
string_value Eigenschaftswert, wenn der Werttyp ein String ist
real_value Eigenschaftswert, wenn der Werttyp „real“ ist
display_value Eigenschaftswert in String umgewandelt

SurfaceFlinger-SQL-Ansichten

Für SurfaceFlinger-Protodaten werden die folgenden Formate verwendet:

Um in Ebenendaten zu suchen, verwenden Sie die Ansicht sf_layer_search. Diese Ansicht enthält die folgenden Spalten:

Spalte Beschreibung
state_id Zeilen-ID des Eintrags, zu dem die Ebene gehört
ts Zeitstempel des Eintrags, zu dem die Ebene gehört
layer_id Ebenen-ID
parent_id Ebenen-ID des übergeordneten Elements
layer_name Ebenenname
property Eigenschaftsname, der wiederkehrende Felder berücksichtigt
flat_property Im Eigenschaftsnamen werden keine wiederkehrenden Felder berücksichtigt
value Eigenschaftswert im Stringformat
previous_value Eigenschaftswert aus dem vorherigen Eintrag im Stringformat

Um nach Daten zu Hierarchie-Stammelementen zu suchen, verwenden Sie die Ansicht sf_hierarchy_root_search. Diese Ansicht enthält die folgenden Spalten:

Spalte Beschreibung
state_id Zeilen-ID des Eintrags
ts Zeitstempel des Eintrags
property Eigenschaftsname, der wiederkehrende Felder berücksichtigt
flat_property Im Eigenschaftsnamen werden keine wiederkehrenden Felder berücksichtigt
value Eigenschaftswert im Stringformat
previous_value Eigenschaftswert aus dem vorherigen Eintrag im Stringformat

Beispielabfragen

  • Alle Frames finden, in denen die IME-Ebene gültige Bildschirmgrenzen hat:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Alle Frames finden, in denen sich die Taskbar-Ebene color.a (Alpha) ändert:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Alle Frames finden, bei denen die untere Grenze von Wallpaper kleiner oder gleich 2.400 ist:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • Liste aller Eigenschaften für Displays mit einem gültigen Ebenen-Stack auflisten:

    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, ']')
        ),
        '%'
      )
    

Datentabellen

Die SurfaceFlinger-Ansichten werden mit den folgenden zugrunde liegenden Tabellen erstellt.

surfaceflinger_layers_snapshot:

Spalte Beschreibung
id Zeilen-ID für den Eintrag
ts Zeitstempel des Eintrags
arg_set_id ID, mit der Zeilen aus der Tabelle args mit diesem Eintrag verknüpft werden

surfaceflinger_layer:

Spalte Beschreibung
id Zeilen-ID für die Ebene
snapshot_id Zeilen-ID des Eintrags aus surfaceflinger_layers_snapshot, zu dem die Ebene gehört
arg_set_id ID, mit der Zeilen aus der Tabelle args mit dieser Ebene verknüpft werden

SQL-Ansicht „Transactions“

Die Proto-Transaktionsdaten haben das Format TransactionTraceEntry.

Um in Transaktions-Trace-Daten zu suchen, verwenden Sie die Ansicht transactions_search. Diese Ansicht enthält die folgenden Spalten:

Spalte Beschreibung
state_id Zeilen-ID des Eintrags, zu dem die Proto-Eigenschaft gehört
ts Zeitstempel des Eintrags, zu dem die Proto-Eigenschaft gehört
transaction_id Transaktions-ID, falls verfügbar
property Eigenschaftsname, der wiederkehrende Felder berücksichtigt
flat_property Im Eigenschaftsnamen werden keine wiederkehrenden Felder berücksichtigt
value Eigenschaftswert im Stringformat

Beispielabfragen

  • Frame suchen, in dem eine Transaktion angewendet wurde, um die Position der Ebene X in -54.0 zu ändern:

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • Frame suchen, in dem die ImeContainer-Ebene hinzugefügt wurde:

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

Datentabellen

Die SQL-Ansicht „Transactions“ wird mit den folgenden zugrunde liegenden Tabellen erstellt.

surfaceflinger_transactions:

Spalte Beschreibung
id Zeilen-ID für den Eintrag
ts Zeitstempel des Eintrags
arg_set_id ID, mit der Zeilen aus der Tabelle args mit diesem Eintrag verknüpft werden
vsync_id VSync-ID, die mit allen Transaktionen in diesem Eintrag verknüpft ist

android_surfaceflinger_transaction:

Spalte Beschreibung
id Zeilen-ID für die Transaktion
snapshot_id Zeilen-ID des Eintrags aus surfaceflinger_transactions, zu dem die Transaktion gehört
arg_set_id ID, mit der Zeilen aus der Tabelle args mit dieser Transaktion verknüpft werden
transaction_id Transaktions-ID aus der Proto-Nachricht
pid Transaktions-PID aus der Proto-Nachricht
uid Transaktions-UID aus der Proto-Nachricht
layer_id ID der mit der Transaktion verknüpften Ebene, falls zutreffend
display_id ID des Displays, das mit der Transaktion verknüpft ist, falls zutreffend
flags_id ID, die zum Abrufen der zugehörigen Flags von android_surfaceflinger_transaction_flag verwendet wird
transaction_type Transaktionstyp

android_surfaceflinger_transaction_flag:

Spalte Beschreibung
flags_id Entspricht dem Wert in einer Zeile in android_surfaceflinger_transaction
flag Übersetzter Flag-String

Einzelne Transaktionen werden der args-Tabelle aus verschiedenen Proto-Nachrichtenformaten hinzugefügt, je nach Transaktionstyp:

  • LAYER_ADDED: LayerCreationArgs Format
  • LAYER_CHANGED: LayerState Format
  • DISPLAY_ADDED: DisplayState Format
  • DISPLAY_CHANGED: DisplayState Format
  • LAYER_DESTROYED: Keine Argumente
  • LAYER_HANDLE_DESTROYED: Keine Argumente
  • DISPLAY_REMOVED: Keine Argumente
  • NOOP: Keine Argumente

SQL-Ansicht für Übergänge

Die Proto-Daten für Übergänge werden im Format ShellTransition verwendet.

Verwenden Sie die Ansicht transitions_search, um nach Daten zu Übergängen zu suchen. Diese Ansicht enthält die folgenden Spalten:

Spalte Beschreibung
ts Zeitpunkt der Auslösung; falls verfügbar, wird die Zeit des Sendens verwendet, andernfalls 0
transition_id Übergangs-ID aus der Proto-Nachricht
property Eigenschaftsname, der wiederkehrende Felder berücksichtigt
flat_property Im Eigenschaftsnamen werden keine wiederkehrenden Felder berücksichtigt
value Transaktions-UID aus der Proto-Nachricht

Beispielabfragen

Eigenschaften von Übergängen finden, die vom DefaultMixedHandler verarbeitet werden:

  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

Datentabellen

Die Ansicht „Übergänge“ wird mit den folgenden zugrunde liegenden Tabellen erstellt.

window_manager_shell_transitions:

Spalte Beschreibung
id Zeilen-ID für den Übergang
ts Zeitpunkt der Auslösung; falls verfügbar, wird der Zeitpunkt des Sendens verwendet, andernfalls 0
transition_id Übergangs-ID aus der Proto-Nachricht
arg_set_id ID, mit der Zeilen aus der Tabelle args mit diesem Übergang verknüpft werden
transition_type Übergangstyp aus Proto-Nachricht
send_time_ns Zeitpunkt des Sendens der Übergangsnachricht, aus der Proto-Nachricht übernommen
dispatch_time_ns Aus der Proto-Nachricht übernommene Zeit für den Übergang
duration_ns Dauer des Übergangs, falls Start- und Endzeit verfügbar
handler Übergangs-Handler: Übersetzung von window_manager_shell_transition_handlers abrufen
status Status des Übergangs: played, merged oder aborted
flags Übergangsflags aus der Proto-Nachricht

window_manager_shell_transition_handlers:

Spalte Beschreibung
handler_id ID, die dem Wert in der Spalte handler von window_manager_shell_transitions entspricht
handler_name Stringübersetzung

android_window_manager_shell_transition_participants:

Spalte Beschreibung
transition_id Übergangs-ID aus der Roh-Proto-Nachricht
layer_id ID des SurfaceFlinger-Ebenenteilnehmers
window_id ID des WindowManager-Containerteilnehmers

SQL-Ansicht „ViewCapture“

Für die ViewCapture-Proto-Daten wird das Format View verwendet.

Verwenden Sie die Ansicht viewcapture_search, um nach Daten zu ViewCapture zu suchen. Diese Ansicht enthält die folgenden Spalten:

Spalte Beschreibung
state_id Zeilen-ID des Status, zu dem die Ansicht gehört
ts Zeitstempel des Status, zu dem die Daten gehören
package_name Paketname
window_name Fenstername
class_name Kursnamen ansehen
property Eigenschaftsname, der wiederkehrende Felder berücksichtigt
flat_property Im Eigenschaftsnamen werden keine wiederkehrenden Felder berücksichtigt
value Eigenschaftswert im Stringformat
previous_value Eigenschaftswert aus dem vorherigen Status im Stringformat

Beispielabfragen

Alle Status ermitteln, wenn sich SearchContainerView in y-Richtung bewegt:

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

Datentabellen

Die Ansicht „Ansichtsaufzeichnung“ wird mit den folgenden zugrunde liegenden Tabellen erstellt.

android_viewcapture:

Spalte Beschreibung
id Zeilen-ID für den Eintrag
ts Zeitstempel des Eintrags
arg_set_id ID, mit der Zeilen aus der Tabelle args mit diesem Eintrag verknüpft werden

android_viewcapture_view:

Spalte Beschreibung
id Zeilen-ID für die Ansicht
snapshot_id Zeilen-ID des Eintrags aus android_viewcapture, zu dem die Ansicht gehört
arg_set_id ID, mit der Zeilen aus der Tabelle args mit dieser Ansicht verknüpft werden

ProtoLog-SQL-Tabelle

Die ProtoLog-Protodaten haben das Format ProtoLogMessage. Diese Ansicht enthält die folgenden Spalten:

Spalte Beschreibung
ts Zeitstempel des Logs
level Protokollebene
tag Tag für die Protokollierungsgruppe
message Logeintrag
stacktrace Stacktrace (falls verfügbar)
location Codespeicherort, von dem die Nachricht stammt

Beispielabfragen

  • Alle Protokolle mit einer Nachricht finden, die transition enthält:

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • So finden Sie alle Logs, die gültige Transaktions-IDs enthalten:

    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, '%');
    

Abfragen ausführen

Sie können Suchanfragen über den Bereich GLOBALE SUCHE links im Suche-Viewer ausführen.

Wenn Sie zum ersten Mal mit dem Bereich GLOBALE SUCHE interagieren, wird die Trace-Suche initialisiert und Winscope erstellt die Hilfs-SQL-Ansichten. Das kann einige Sekunden dauern. Während der Trace-Suche wird die Zeitachse nicht angezeigt.

Geben Sie eine Suchanfrage in das Suchfeld ein und klicken Sie auf Suchanfrage ausführen oder drücken Sie die Eingabetaste, um die Suche auszuführen.

Wenn Sie fertig sind, wird die Ergebnistabelle im mittleren Bereich angezeigt. Ihre Suchanfrage wird unter dem Suchfeld angezeigt. Dort gibt es auch ein Feld, in dem Sie die Suchanfrage zwischen den Sitzungen speichern können.

Sie können auf gespeicherte Abfragen zugreifen, indem Sie im linken Bereich auf den Tab Gespeichert klicken. Auf kürzlich ausgeführte Abfragen greifen Sie über den Tab Letzte zu:

Linker Bereich der Suchansicht

Abbildung 2: Im linken Bereich der Suchansicht

Ergebnisse

Alle Abfragen geben tabellarische Ergebnisse zurück, die in einer scrollbaren Ansicht mit interaktivem Verhalten angezeigt werden, ähnlich wie bei den logbasierten Trace-Viewern wie „Transactions“ und „ProtoLog“:

Suchansicht – Ergebnisse

Abbildung 3: Ergebnisse in der Suchansicht

Wenn die resultierende Tabelle eine Spalte ts enthält, werden die Werte in dieser Spalte als Zeitstempel interpretiert und dem Zeitachsen-Overlay als neue Zeile mit Einträgen hinzugefügt. Klicken Sie auf diese Zeile und verwenden Sie die Links- und Rechtspfeiltasten, um zwischen den Einträgen zu wechseln:

Zeitachse der Suche

Abbildung 4: Suchzeitachse