使用 SQL 找出 Winscope Perfetto 追蹤記錄中的特定狀態。使用 Winscope UI 中的全球 Search 檢視器執行查詢,並以表格形式呈現結果:
圖 1. 「Search Viewer」分頁。
您可以使用搜尋檢視器在 Perfetto 追蹤記錄上編寫及執行自訂 SQL 查詢,以及存取近期和已儲存的查詢。Winscope 提供專用 SQL 檢視畫面,協助搜尋 SurfaceFlinger 和交易追蹤記錄。
請針對所有檢視畫面使用下列慣例:
property
和flat_property
欄:- 屬性名稱採用蛇形命名法,例如
LayerProto
中的visible_region
。 點標記法用於表示巢狀屬性,例如
visible_region.rect
。property
中的重複欄位會以方括號加以區分:舉例來說,在重複欄位
visible_region.rect
的兩個例項中,top
欄位會由visible_region.rect[0].top
和visible_region.rect[1].top
代表。flat_property
中的重複欄位無法區分:舉例來說,在重複欄位
visible_region.rect
的兩個例項中,top
欄位會由兩個例項中的visible_region.rect.top
表示。
- 屬性名稱採用蛇形命名法,例如
value
和previous_value
欄:- 布林值由
'0'
(False
) 或'1'
(True
) 表示。
- 布林值由
SurfaceFlinger SQL 檢視
SurfaceFlinger 原型資料採用下列格式:
圖層資料採用
LayerProto
格式。階層根資料採用
LayersSnapshotProto
格式。
如要搜尋圖層資料,請使用 sf_layer_search
檢視畫面。這個檢視畫面包含下列資料欄:
Column | 說明 |
---|---|
state_id |
圖層所屬項目的專屬 ID |
ts |
層所屬項目的時間戳記 |
layer_id |
圖層 ID |
parent_id |
父項的圖層 ID |
layer_name |
圖層名稱 |
property |
重複欄位的屬性名稱計算 |
flat_property |
資源名稱不包含重複欄位 |
value |
以字串格式顯示的屬性值 |
previous_value |
上一個項目的屬性值,以字串格式表示 |
如要搜尋階層根資料,請使用 sf_hierarchy_root_search
檢視畫面。這個檢視畫面包含下列資料欄:
Column | 說明 |
---|---|
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
(alpha) 變更的所有影格:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'Taskbar%' AND property='color.a' AND value!=previous_value
找出
Wallpaper
底部邊界小於或等於 2400 的所有影格: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
檢視畫面。這個檢視畫面包含以下資料欄:
Column | 說明 |
---|---|
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
檢視畫面。這個檢視畫面包含以下資料欄:
Column | 說明 |
---|---|
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
檢視畫面。這個檢視畫面包含以下資料欄:
Column | 說明 |
---|---|
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
格式。這個檢視畫面包含下列資料欄:
Column | 說明 |
---|---|
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. 搜尋檢視器左側面板。
結果
所有查詢都會傳回表格化結果,並以可捲動的檢視畫面顯示,其互動行為類似於以記錄為基礎的追蹤檢視器,例如交易和 ProtoLog:
圖 3. 搜尋檢視器結果。
如果產生的資料表包含 ts
資料欄,系統會將該欄中的值解讀為時間戳記,並將其新增至時間軸疊加圖層,做為新的一列項目。按一下這個資料列,然後使用向左鍵和向右鍵瀏覽各個項目:
圖 4. 搜尋時間軸。