追蹤記錄搜尋

使用 SQL 找出 Winscope Perfetto 追蹤記錄中的特定狀態。使用 Winscope UI 中的全球 Search 檢視器執行查詢,並以表格形式呈現結果:

搜尋檢視器分頁

圖 1. 「Search Viewer」分頁。

您可以使用搜尋檢視器在 Perfetto 追蹤記錄上編寫及執行自訂 SQL 查詢,以及存取近期和已儲存的查詢。Winscope 提供專用 SQL 檢視畫面,協助搜尋 SurfaceFlinger 和交易追蹤記錄。

請針對所有檢視畫面使用下列慣例:

  • propertyflat_property 欄:

    • 屬性名稱採用蛇形命名法,例如 LayerProto 中的 visible_region
    • 點標記法用於表示巢狀屬性,例如 visible_region.rect

    • property 中的重複欄位會以方括號加以區分:

      舉例來說,在重複欄位 visible_region.rect 的兩個例項中,top 欄位會由 visible_region.rect[0].topvisible_region.rect[1].top 代表。

    • flat_property 中的重複欄位無法區分:

      舉例來說,在重複欄位 visible_region.rect 的兩個例項中,top 欄位會由兩個例項中的 visible_region.rect.top 表示。

  • valueprevious_value 欄:

    • 布林值由 '0' (False) 或 '1' (True) 表示。

SurfaceFlinger SQL 檢視

SurfaceFlinger 原型資料採用下列格式:

如要搜尋圖層資料,請使用 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. 搜尋時間軸。