SQL を使用して、Winscope Perfetto トレース内の特定の状態を見つけます。Winscope UI のグローバル 検索ビューアを使用して、クエリを実行し、表形式の結果を可視化します。
図 1. [視聴者を検索] タブ。
検索ビューアでは、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 プロトデータは、次の形式を使用します。
レイヤデータは
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 ビュー
トランザクション プロトデータは 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. 検索タイムライン。