トレース検索

SQL を使用して、Winscope Perfetto トレース内の特定の状態を検索します。また、Winscope UI のグローバルな [Search] ビューアを使用して、クエリを実行し、結果をテーブル形式で可視化します。

[Search] ビューアのタブ

図 1. [Search] ビューアのタブ。

[Search] ビューアでは、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 の proto データでは、次の形式が使用されます。

レイヤデータを検索するには、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 ビュー

トランザクションの proto データでは、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 ビュー

遷移の proto データでは、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 の proto データでは、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 の proto データでは、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, '%');
    

クエリを実行する

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

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

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

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

[Search] ビューアの左側のパネル

図 2. [Search] ビューアの左側のパネル。

結果

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

[Search] ビューアの結果

図 3. [Search] ビューアの結果。

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

検索のタイムライン

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