SQL を使用して、Winscope Perfetto トレース内の特定の状態を検索します。また、Winscope UI のグローバルな [Search] ビューアを使用して、クエリを実行し、結果をテーブル形式で可視化します。
図 1. [Search] ビューアのタブ。
[Search] ビューアでは、Perfetto トレースに対してカスタム SQL クエリを作成して実行したり、最近実行したクエリや保存したクエリにアクセスしたりできます。Winscope には、SurfaceFlinger トレースとトランザクション トレースの検索に役立つ専用の SQL ビューが用意されています。
すべてのビューで次の規則を使用します。
property
列とflat_property
列の場合:- プロパティ名はスネークケースで指定します(例:
LayerProto
のvisible_region
)。 ネストされたプロパティを表すには、ドット表記を使用します(例:
visible_region.rect
)。property
の繰り返しフィールドは角かっこで区別されます。たとえば、繰り返しフィールド
visible_region.rect
の 2 つのインスタンス内では、top
フィールドはvisible_region.rect[0].top
とvisible_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 データでは、次の形式が使用されます。
レイヤデータは
LayerProto
形式です。階層ルートデータは
LayersSnapshotProto
形式です。
レイヤデータを検索するには、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] タブをクリックします。
図 2. [Search] ビューアの左側のパネル。
結果
すべてのクエリでテーブル形式の結果が返されます。この結果は、Transactions や ProtoLog などのログベースのトレース ビューアと同様に、インタラクティブな動作を備えたスクロール可能なビューに表示されます。
図 3. [Search] ビューアの結果。
生成されたテーブルに ts
列が含まれている場合、その列の値はタイムスタンプとして解釈され、エントリの新しい行としてタイムライン オーバーレイに追加されます。この行をクリックし、左右の矢印キーを使ってエントリ間を移動します。
図 4. 検索のタイムライン。