背景:
在aosp16的Winscope體驗時候發現多了數據的搜索功能,也體驗了一下,這個新功能本身Winscope也自帶了很多指導提示,主要是用來解決Winscope有時候尋找某個數據,某個layer時候的不便,本文來詳細介紹一下這塊搜索如何使用的內容。
體驗Winscope搜索功能相關:
Winscope上數據記錄搜索
使用 SQL 在 Winscope Perfetto 跟蹤記錄中查找特定狀態。使用 Winscope 界面中的全局搜索查看器運行查詢并直觀呈現表格化結果:
圖 1. 搜索查看器標簽頁
借助搜索查看器,您可以針對 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 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_searchWHERE layer_name like 'IME%'AND property='screen_bounds.bottom'AND value<='24000'
注意:我們計劃向 SurfaceFlinger 跟蹤記錄添加更準確的 isVisible 屬性。
查找 Taskbar 層 color.a (alpha) 發生變化的所有幀:
SELECT ts, value, previous_value FROM sf_layer_searchWHERE layer_name like 'Taskbar%'AND property='color.a'AND value!=previous_value
查找 Wallpaper 底部邊界小于或等于 2400 的所有幀:SELECT ts, value, previous_value FROM sf_layer_searchWHERE 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 STATEON STATE.state_id = STATE_WITH_DISPLAY_ON.state_idAND 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_searchWHERE flat_property='transactions.layer_changes.x'AND value='-54.0'
找到添加 ImeContainer 層的幀:
SELECT ts FROM transactions_searchWHERE flat_property='added_layers.name'AND value='ImeContainer'
ShellTransition SQL 視圖
過渡 proto 數據使用 ShellTransition 格式。
如需搜索過渡數據,請使用 transitions_search 視圖。此視圖包含以下列:
列 說明
ts 分派時間 - 如果有發送時間,則回退到發送時間,否則為 0
transition_id 過渡 ID
property 考慮重復字段的屬性名稱
flat_property 屬性名稱不考慮重復字段
value 以字符串格式顯示的屬性值
示例查詢
查找由 DefaultMixedHandler 處理的過渡的屬性:
SELECTPROPS.ts,PROPS.transition_id,PROPS.property,PROPS.valueFROM transitions_search HANDLER_MATCHINNER JOIN transitions_search PROPSON HANDLER_MATCH.transition_id = PROPS.transition_idWHERE 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_searchWHERE 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 protologWHERE message LIKE '%transition%'
查找包含有效事務 ID 的所有日志:
CREATE PERFETTO VIEW valid_tx_ids ASSELECT DISTINCT transaction_id FROM transactions_searchWHERE transaction_id IS NOT NULL AND transaction_id != '0';SELECT TRANS.transaction_id, message FROM valid_tx_ids TRANS
INNER JOIN protolog LOGSON LOGS.message LIKE CONCAT('%', TRANS.transaction_id, '%');
運行查詢
使用左側面板時,系統會開始搜索跟蹤記錄。此過程需要幾秒鐘的時間。在開始時,時間軸不可用。
開始跟蹤記錄搜索后,在搜索框中輸入查詢,然后點擊 Run Search Query 或按鍵盤上的 Enter 以運行該查詢。
完成后,結果表格會顯示在中間面板中。您的查詢會顯示在搜索框下方,并帶有一個在會話之間保存查詢的字段。
您可以通過點擊左側面板中的 Saved 標簽頁來訪問已保存的查詢,也可以通過點擊 Recent 標簽頁來訪問最近運行的查詢:
圖 2. 搜索查看器左側面板。
結果
所有查詢都會返回表格式結果,并在可滾動視圖中顯示,其交互行為類似于基于日志的跟蹤記錄查看器(例如 Transactions 和 ProtoLog):
圖 3. 搜索查看器結果。
如果生成的表格包含 ts 列,則該列中的值會被解釋為時間戳,并作為新行條目添加到時間軸疊加層中。點擊此行,然后使用向左和向右箭頭鍵在條目之間導航:
圖 4. 搜索時間軸。