トレース検索

SQL を使用して、Winscope Perfetto トレース内の特定の状態を見つけます。Winscope UI のグローバル 検索ビューアを使用して、クエリを実行し、表形式の結果を可視化します。

検索閲覧者のタブ

図 1. [視聴者を検索] タブ。

検索ビューアでは、Perfetto トレースに対してカスタム SQL クエリを作成して実行したり、最近のクエリや保存したクエリにアクセスしたりできます。Winscope には、SurfaceFlinger とトランザクション トレースの検索に役立つ専用の SQL ビューが用意されています。

すべてのビューで次の規則を使用します。

  • property 列と flat_property 列の場合:

    • プロパティ名はスネークケースで指定します(LayerProtovisible_region など)。
    • ネストされたプロパティを表すには、ドット表記を使用します(例: visible_region.rect)。

    • property の繰り返しフィールドは角かっこで区別されます。

      たとえば、繰り返しフィールド visible_region.rect の 2 つのインスタンス内では、top フィールドは visible_region.rect[0].topvisible_region.rect[1].top で表されます。

    • flat_property の繰り返しフィールドは区別できません。

      たとえば、繰り返しフィールド visible_region.rect の 2 つのインスタンス内では、top フィールドは両方のインスタンスで visible_region.rect.top で表されます。

  • value 列と previous_value 列の場合:

    • ブール値は '0'False)または '1'True)で表されます。

SurfaceFlinger SQL ビュー

SurfaceFlinger プロトデータは、次の形式を使用します。

レイヤデータを検索するには、sf_layer_search ビューを使用します。このビューには次の列が含まれます。

説明
state_id レイヤが属するエントリの一意の ID
ts レイヤが属するエントリのタイムスタンプ
layer_id レイヤ ID
parent_id 親のレイヤ ID
layer_name レイヤ名
property 繰り返しフィールドを考慮したプロパティ名
flat_property プロパティ名が重複フィールドを考慮していない
value 文字列形式のプロパティ値
previous_value 前のエントリの属性値(文字列形式)

階層ルートデータを検索するには、sf_hierarchy_root_search ビューを使用します。このビューには次の列が含まれています。

説明
state_id エントリの一意の ID
ts エントリのタイムスタンプ
property 繰り返しフィールドを考慮したプロパティ名
flat_property プロパティ名が重複フィールドを考慮していない
value 文字列形式のプロパティ値
previous_value 前のエントリの属性値(文字列形式)

クエリの例

  • IME レイヤに有効な画面境界があるすべてのフレームを探します。

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Taskbar レイヤ color.a(アルファ)が変更されるすべてのフレームを見つけます。

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Wallpaper の下限が 2,400 以下のすべてのフレームを検索します。

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • 有効なレイヤスタックを持つディスプレイのすべてのプロパティを一覧表示します。

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

トランザクションの SQL ビュー

トランザクション プロトデータは TransactionTraceEntry 形式を使用します。

トランザクション データを検索するには、transactions_search ビューを使用します。このビューには次の列が含まれます。

説明
state_id proto プロパティが属するエントリの一意の ID
ts proto プロパティが属するエントリのタイムスタンプ
transaction_id 取引 ID(利用可能な場合)
property 繰り返しフィールドを考慮したプロパティ名
flat_property プロパティ名が重複フィールドを考慮していない
value 文字列形式のプロパティ値

クエリの例

  • レイヤの x 位置を -54.0 に変更するトランザクションが適用されたフレームを見つけます。

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • ImeContainer レイヤが追加されたフレームを見つけます。

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

遷移 SQL ビュー

遷移プロトデータは ShellTransition 形式を使用します。

遷移データを検索するには、transitions_search ビューを使用します。このビューには次の列が含まれます。

説明
ts 発送日時 - 利用可能な場合は送信日時が使用されます。それ以外の場合は 0 です。
transition_id 遷移 ID
property 繰り返しフィールドを考慮したプロパティ名
flat_property プロパティ名が重複フィールドを考慮していない
value 文字列形式のプロパティ値

クエリの例

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

ViewCapture SQL ビュー

ViewCapture プロトデータは View 形式を使用します。

ViewCapture データを検索するには、viewcapture_search ビューを使用します。このビューには次の列が含まれます。

説明
state_id ビューが属する状態の一意の ID
ts ビューが属する状態のタイムスタンプ
package_name パッケージ名
window_name ウィンドウ名
class_name クラス名を表示する
property 繰り返しフィールドを考慮したプロパティ名
flat_property プロパティ名が重複フィールドを考慮していない
value 文字列形式のプロパティ値
previous_value 前の状態のプロパティ値(文字列形式)

クエリの例

SearchContainerView が y 方向に移動したとき、すべての状態を検索します。

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

ProtoLog SQL テーブル

ProtoLog プロトデータは ProtoLogMessage 形式を使用します。このビューには次の列があります。

説明
ts ログのタイムスタンプ
level ログレベル
tag ロギング グループタグ
message ログ メッセージ
stacktrace スタックトレース(利用可能な場合)
location メッセージの発生元のコード位置

クエリの例

  • transition を含むメッセージを含むすべてのログを検索します。

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • 有効な取引 ID を含むすべてのログを検索します。

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

クエリを実行する

左側のパネルを使用すると、トレース検索が開始されます。これには数秒かかります。開始中はタイムラインを使用できません。

トレース検索が初期化されたら、検索ボックスにクエリを入力し、[検索クエリを実行] をクリックするか、キーボードの Enter キーを押して実行します。

完了すると、結果の表が中央のパネルに表示されます。クエリは検索ボックスの下に表示され、セッション間でクエリを保存するためのフィールドがあります。

保存したクエリにアクセスするには、左側のパネルの [保存済み] タブをクリックします。最近実行したクエリにアクセスするには、[最近] タブをクリックします。

検索ビューアの左側のパネル

図 2. 検索ビューアの左側のパネル。

結果

すべてのクエリは表形式の結果を返します。この結果は、Transactions や ProtoLog などのログベースのトレース ビューアと同様に、スクロール可能なビューにインタラクティブな動作で表示されます。

検索ビューアの検索結果

図 3. 検索ビューアの検索結果。

生成されたテーブルに ts 列が含まれている場合、その列の値はタイムスタンプとして解釈され、エントリの新しい行としてタイムライン オーバーレイに追加されます。この行をクリックし、左右の矢印キーを使ってエントリ間を移動します。

検索タイムライン

図 4. 検索タイムライン。