使用 Winscope 追蹤視窗轉換

Winscope 是一個 Web 工具,可讓使用者在動畫和轉換期間和之後記錄、重播和分析多個系統服務的狀態。 Winscope 將所有相關的系統服務狀態記錄到追蹤檔案中。將 Winscope UI 與追蹤檔案結合使用,您可以透過重播、單步執行和調試過渡來檢查每個動畫幀的這些服務的狀態(無論是否有螢幕錄製)。

產生可載入到 Winscope 中的追蹤的系統服務如下:

  • SurfaceFlinger
  • 視窗管理器
  • WMShell
  • 啟動器

運行 Winscope 追蹤檢視器

Winscope 追蹤是平台上服務的一部分。本節概述了下載、建置和執行 Winscope 追蹤檢視器所需的步驟。

請按照以下步驟設定您的 PC 以執行 Winscope 追蹤器:

  1. 下載 Android 原始碼
  2. 導航到 Winscope 資料夾:

    cd development/tools/winscope
    
  3. 使用以下命令安裝相依性:

    npm install
    

    若要查看可用指令的列表,請執行: npm run

  4. 使用以下方式建立所有生產和測試目標:

    npm run build:prod
    
  5. 使用以下命令執行 Winscope:

    npm run start
    

捕捉痕跡

您可以透過WinscopeAndroid 偵錯橋 (adb)命令來擷取裝置上的追蹤資訊。

捕獲設備上的痕跡

在提交動畫問題的錯誤時捕獲設備上的痕跡以收集資料。所有 UI 追蹤均使用此方法記錄,因為無法自訂配置。

在您的 Android 裝置上:

  1. 啟用開發者選項
  2. 選擇“開發人員選項”下的“系統追蹤”
  3. 啟用收集 Winscope 追蹤
  4. 雜項下:
    1. 啟用將錄音附加到錯誤報告
    2. 啟用“顯示快速設定”磁貼
  5. 導航到需要重現錯誤的位置。
  6. 要開始捕獲,請開啟“快速設定”並選擇“記錄追蹤”

    quick_setting_winscope

    圖 1.帶有記錄追蹤的快速設定選單。

  7. 僅執行重現錯誤所需的步驟

  8. 要停止捕獲,請開啟“快速設定”並選擇“停止追蹤”

  9. 使用列出的選項之一共用擷取的日誌,例如 Gmail、Drive 或 BetterBug。

透過 Winscope 捕獲痕跡

您可以使用 Winscope 捕獲追蹤以進行本機開發和偵錯。 Winscope 使用adb ,它支援透過 USB 或 Wi-Fi 連接裝置。

在 Winscope 上:

  1. 收集追蹤畫面上,按一下ADB 代理程式

    capture_traces_winscope

    圖 2.在 Winscope 上捕獲追蹤。

  2. 啟動 Winscope ADB Connect 代理程式以直接從瀏覽器捕獲追蹤。

  3. 運行命令:

    python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
    
  4. 若要開始捕獲,請在「收集追蹤」畫面上選擇目標和配置,然後按一下「開始追蹤」

    collect_traces_winscope

    圖 3.在 Winscope 上收集追蹤。

  5. 要停止捕獲,請按一下結束追蹤

    end_trace_winscope

    圖 4.Winscope上的結束追蹤。

當工具將追蹤上傳到 Winscope 的 UI 上時,螢幕上會顯示「正在取得解析原始檔案」訊息。

使用 Winscope 產生狀態轉儲

若要使用 Winscope 進行狀態轉儲,請在「收集追蹤」畫面上選擇「轉儲」選項卡,然後按一下「轉儲狀態」

dump-winscope

圖 5. Winscope 上的轉儲狀態。

透過adb指令捕獲痕跡

在為以下每個追蹤執行adb shell命令之前執行adb root 。追蹤結束時,追蹤檔案位於/data/misc/wmtrace中。若要從裝置複製檔案或目錄及其子目錄,請參閱將檔案複製到裝置或從裝置複製檔案。請參閱adb以了解更多資訊。

視窗管理器追蹤

要捕獲 WindowManager 追蹤:

  • 啟用追蹤:

    adb shell wm tracing start
    
  • 禁用追蹤:

    adb shell wm tracing stop
    
  • 運行追蹤擷取時將日誌記錄資料儲存到檔案:

    adb shell wm tracing save-for-bugreport
    
  • 每幀記錄一次追蹤:

    adb shell wm tracing frame
    
  • 記錄每筆交易:

    adb shell wm tracing transaction
    
  • 設定最大日誌大小(以 KB 為單位):

    adb shell wm tracing size
    
  • 列印追蹤狀態:

    adb shell wm tracing status
    
  • 將日誌等級設為critical 」(僅包含減少訊息的可見視窗)、 trim (包含減少資訊的所有視窗)或all (所有視窗和資訊):

    adb shell wm tracing level
    

原始日誌

以下指令用於ProtoLog系統。

system_server進程中:

  • 啟動原始日誌:

    adb shell cmd window logging start
    
  • 停止原日誌:

    adb shell cmd window logging stop
    
  • 為給定的日誌組啟用 ProtoLog:

    adb shell cmd window logging enable [group...]
    
  • 停用給定日誌組的 ProtoLog:

    adb shell cmd window logging disable [group...]
    
  • 為給定的日誌組啟用Logcat日誌記錄:

    adb shell cmd window logging enable-text [group...]
    
  • 停用給定日誌組的 Logcat 日誌記錄:

    adb shell cmd window logging disable-text [group...]
    

在 WMShell 中:

  • 啟動原始日誌:

    adb shell dumpsys activity service SystemUIService WMShell
    

轉換追蹤

以下命令用於轉換追蹤:

system_server進程中:

  • 開始跟蹤:

    adb shell cmd window shell tracing start
    
  • 停止追蹤:

    adb shell cmd window shell tracing stop
    
  • 在 WMShell 中啟動追蹤:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
    
  • 在 WMShell 中停止追蹤:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
    

輸入法編輯器

以下命令用於輸入法編輯器 (IME) 追蹤:

  • 啟動輸入法 (IM) 用戶端、輸入法服務 (IMS) 和輸入法管理服務 (IMMS) 的 IME 追蹤:

    adb shell ime tracing start
    
  • 開始追蹤 IME 用戶端、IMS 和 IMMS:

    adb shell ime tracing stop
    

SurfaceFlinger 層

SurfaceFlinger 層追蹤使用 Perfetto 追蹤進行捕獲。有關配置信息,請參閱跟踪配置

請參閱以下 SurfaceFlinger 層追蹤的設定範例:

unique_session_name: "surfaceflinger_layers_active"
buffers: {
    size_kb: 63488
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.layers"
        surfaceflinger_layers_config: {
            mode: MODE_ACTIVE
            trace_flags: TRACE_FLAG_INPUT
            trace_flags: TRACE_FLAG_COMPOSITION
            trace_flags: TRACE_FLAG_HWC
            trace_flags: TRACE_FLAG_BUFFERS
            trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
        }
    }
}

請參閱以下範例指令來產生 SurfaceFlinger 層的追蹤:

adb shell -t perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

SurfaceFlinger 事務

SurfaceFlinger 事務追蹤使用 Perfetto 追蹤進行擷取。有關配置信息,請參閱跟踪配置

請參閱以下 SurfaceFlinger主動追蹤的 Perfetto 設定範例:

unique_session_name: "surfaceflinger_transactions_active"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_ACTIVE
        }
    }
}
write_into_file: true
file_write_period_ms: 100

請參閱以下 SurfaceFlinger連續追蹤的 Perfetto 設定範例:

unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_CONTINUOUS
        }
    }
}

請參閱以下範例指令來產生 SurfaceFlinger 事務的追蹤:

    adb shell perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

使用 adb 產生狀態轉儲

Winscope 從錯誤報告中讀取 WindowManager 和 SurfaceFlinger 狀態的快照。錯誤報告將狀態儲存為proto資料夾中的單獨 proto 檔案。若要使用 adb 產生狀態轉儲,請執行下列命令。

對於視窗管理器:

adb exec-out dumpsys window --proto > window_dump.winscope

對於 SurfaceFlinger:

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

分析痕跡

為了調試導致動畫問題的瞬態和無效狀態,Winscope 聚合不同的追蹤文件,提供幀和時間軸上的搜尋和視覺化,並以連貫的方式呈現 protobuf 訊息。分析 Winscope 中的追蹤有助於識別錯誤發生的確切層、框架和狀態。

使用Winscope

捕獲追蹤後,在 Winscope 上分析追蹤:

  1. 使用右側面板上傳您已儲存的軌跡。您可以刪除上傳的追蹤或上傳更多追蹤。

    upload_traces_winscope

    圖 6.在 Winscope 上傳追蹤記錄。

  2. 點擊查看追蹤以視覺化上傳的追蹤。每個軌跡的標籤顯示在視窗的頂部面板上。如果上傳的檔案包含相關軌跡,則螢幕錄製軌跡的浮動視圖會疊加在螢幕上。

    view_traces_winscope

    圖 7.在 Winscope 上查看追蹤。

    使用視窗最頂部面板上的 UI 進行重新命名編輯名稱並下載您上傳的跟踪下載追蹤或上傳新的。

  3. 使用視窗底部面板上的時間滑桿工具隨著時間的推移瀏覽軌跡。對於額外的時間導航,請使用以下功能,如圖 8 所示:

    • 若要導覽至特定時間或事件,請使用遊標(時間滑桿)或左側左箭頭時間和對的箭頭右時間時間顯示框(左下角)中的箭頭,或鍵盤上的左右箭頭。
    • 若要在時間軸上顯示選取的顏色編碼軌跡,請使用下拉式選單(時間滑桿左側)。預設情況下,使用追蹤標籤查看的最後三個追蹤顯示在時間線上。
    • 若要查看所有上傳的追蹤記錄,請使用放大功能放大時間或縮小縮小時間工具(在時間滑桿下方),或在鍵盤上滾動。使用重置按鈕重置縮放等級。
    • 若要查看隨時間變化的跡線分佈的展開視圖,請按一下向上箭頭箭頭向上時間(右下角)。

    time_nav_winscope

    8.Winscope 上的時間導航。

    在展開視圖(圖 9)中,選擇並放大特定時間範圍以便更好地檢查:

    expand_time_winscope

    圖 9.Winscope上的擴充時間軸。

  4. 若要檢查痕跡,您可以透過螢幕錄製查看裝置狀態。要檢查特定跟踪,請單擊工具頂部面板上的相關跟踪選項卡。

    • 對於Surface Flinger跟踪,三個面板顯示給定時間段內跟踪的不同視圖,如圖 10 所示:sf_trace

      圖 10. Winscope 上的 Surface Flinger 追蹤。

      • 圖層視圖:矩形疊加層的 3D 視圖。以下 UI 元素調整矩形以根據其位置、大小、變換和 z 順序呈現圖形元素:

        • 旋轉滑桿(「圖層」視圖的左上角)可旋轉分層矩形以選取的角度查看它們。
        • 間距滑桿(「圖層」視圖的右上角)可調整圖層之間的間距以建立所選的複合視圖。
        • 縮放工具(圖層視圖的右上角)放大放大時間並縮小縮小時間進入各層以便更好檢查。
        • 重置按鈕重置_sf(圖層視圖的右上角)將相機設定恢復到原始視圖。
        • 拖曳矩形以方便更好地縮放。
      • 層次結構視圖:完整的層層次結構。

        • 「僅可見」 (「層次結構」視圖的右上角)選擇後,會隱藏層次結構中的不可見層,以協助視覺化螢幕上的元素。
        • 「平面」 (「層次結構」視圖的右上角)選擇後,會將層次結構顯示為扁平的圖層清單。
        • 僅當存在狀態轉換時才選擇「顯示差異」(「層次結構」視圖的左上角)。選擇後,工具會將目前狀態與前一個狀態進行比較。新元素以綠色突出顯示,刪除的元素以紅色突出顯示,修改的元素以藍色突出顯示。
      • 屬性視圖:所選圖層的屬性。 Properties視圖的頂部面板僅包含有關關鍵屬性的信息,例如VisibilityGeometryBuffer屬性視圖的底部面板包含所有屬性的原型轉儲

        • 「顯示差異」複選框(「屬性」視圖的左上角)的行為與「層次結構」視圖中的行為相同。
        • 顯示預設值(「屬性」視圖的左上角),選擇後會顯示原型轉儲上的預設原型值。預設情況下,這些值不會在原始轉儲中列出。預設的原型值取自原型欄位定義。如果原型欄位沒有設定非空預設值,則顯示的預設原型值為:
          • 字串:空
          • 數量:0
          • 布林值:False
          • 物件:空

      三個視圖之間的選擇和螢幕錄製是同步的,也就是說,當您導航到不同的時間點時,所有軌跡都會同步更新。若要查看圖層的屬性,請透過在「層次結構」檢視中按一下該圖層或按一下「屬性」檢視中對應的矩形來選取該圖層。紫色矩形表示視圖軌跡附加到該圖層。雙擊紫色圖層時,UI 會導覽至相關視圖追蹤標籤。

    • 對於視窗管理器跟踪,三個面板顯示給定時間段內跟踪的不同視圖,如圖 11 所示:

      • 視窗視圖:圖層的 3D 視圖。
      • 層次結構視圖:完整的層層次結構。
      • 屬性視圖包含所有屬性的原始轉儲

      三個視圖之間的選擇和螢幕錄製是同步的,也就是說,當您導航到不同的時間點時,所有軌跡都會同步更新。

      wm_trace

      圖 11. Winscope 上的視窗管理器追蹤。

    • 對於事務追蹤,SurfaceFlinger 和視窗管理器之間的事務以表格格式呈現,可透過顯示的 ID、類型和文字以及顯示原始轉儲的屬性視圖進行搜尋。兩個視圖之間的選擇和螢幕錄製是同步的:

      transaction_trace

      圖 12.Winscope上的事務追蹤。

    • 對於ProtoLog追蹤,資訊以表格格式呈現,可透過標籤、原始檔案和文字進行搜尋:

      protolog_trace

      圖 13. Winscope 上的 ProtoLog 追蹤。

    • 對於轉換跟踪,會顯示包含 ID、類型、傳送時間、持續時間和狀態的轉換清單以及所選轉換的屬性:

      transitions_trace

      圖 14. Winscope 上的轉換追蹤。