Winscope 是一個 Web 工具,可讓使用者在動畫和轉換期間和之後記錄、重播和分析多個系統服務的狀態。 Winscope 將所有相關的系統服務狀態記錄到追蹤檔案中。將 Winscope UI 與追蹤檔案結合使用,您可以透過重播、單步執行和調試過渡來檢查每個動畫幀的這些服務的狀態(無論是否有螢幕錄製)。
產生可載入到 Winscope 中的追蹤的系統服務如下:
- SurfaceFlinger
- 視窗管理器
- WMShell
- 我
- 啟動器
運行 Winscope 追蹤檢視器
Winscope 追蹤是平台上服務的一部分。本節概述了下載、建置和執行 Winscope 追蹤檢視器所需的步驟。
請按照以下步驟設定您的 PC 以執行 Winscope 追蹤器:
- 下載 Android 原始碼。
導航到 Winscope 資料夾:
cd development/tools/winscope
使用以下命令安裝相依性:
npm install
若要查看可用指令的列表,請執行:
npm run
使用以下方式建立所有生產和測試目標:
npm run build:prod
使用以下命令執行 Winscope:
npm run start
捕捉痕跡
您可以透過Winscope或Android 偵錯橋 (adb)命令來擷取裝置上的追蹤資訊。
捕獲設備上的痕跡
在提交動畫問題的錯誤時捕獲設備上的痕跡以收集資料。所有 UI 追蹤均使用此方法記錄,因為無法自訂配置。
在您的 Android 裝置上:
- 啟用開發者選項。
- 選擇“開發人員選項”下的“系統追蹤” 。
- 啟用收集 Winscope 追蹤。
- 在雜項下:
- 啟用將錄音附加到錯誤報告。
- 啟用“顯示快速設定”磁貼。
- 導航到需要重現錯誤的位置。
要開始捕獲,請開啟“快速設定”並選擇“記錄追蹤” :
圖 1.帶有記錄追蹤的快速設定選單。
僅執行重現錯誤所需的步驟。
要停止捕獲,請開啟“快速設定”並選擇“停止追蹤” 。
使用列出的選項之一共用擷取的日誌,例如 Gmail、Drive 或 BetterBug。
透過 Winscope 捕獲痕跡
您可以使用 Winscope 捕獲追蹤以進行本機開發和偵錯。 Winscope 使用adb ,它支援透過 USB 或 Wi-Fi 連接裝置。
在 Winscope 上:
在收集追蹤畫面上,按一下ADB 代理程式:
圖 2.在 Winscope 上捕獲追蹤。
啟動 Winscope ADB Connect 代理程式以直接從瀏覽器捕獲追蹤。
運行命令:
python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
若要開始捕獲,請在「收集追蹤」畫面上選擇目標和配置,然後按一下「開始追蹤」 :
圖 3.在 Winscope 上收集追蹤。
要停止捕獲,請按一下結束追蹤:
圖 4.Winscope上的結束追蹤。
當工具將追蹤上傳到 Winscope 的 UI 上時,螢幕上會顯示「正在取得和解析原始檔案」訊息。
使用 Winscope 產生狀態轉儲
若要使用 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 上分析追蹤:
使用右側面板上傳您已儲存的軌跡。您可以刪除上傳的追蹤或上傳更多追蹤。
圖 6.在 Winscope 上傳追蹤記錄。
點擊查看追蹤以視覺化上傳的追蹤。每個軌跡的標籤顯示在視窗的頂部面板上。如果上傳的檔案包含相關軌跡,則螢幕錄製軌跡的浮動視圖會疊加在螢幕上。
圖 7.在 Winscope 上查看追蹤。
使用視窗最頂部面板上的 UI 進行重新命名並下載您上傳的跟踪或上傳新的。
使用視窗底部面板上的時間滑桿工具隨著時間的推移瀏覽軌跡。對於額外的時間導航,請使用以下功能,如圖 8 所示:
- 若要導覽至特定時間或事件,請使用遊標(時間滑桿)或左側和對的時間顯示框(左下角)中的箭頭,或鍵盤上的左右箭頭。
- 若要在時間軸上顯示選取的顏色編碼軌跡,請使用下拉式選單(時間滑桿左側)。預設情況下,使用追蹤標籤查看的最後三個追蹤顯示在時間線上。
- 若要查看所有上傳的追蹤記錄,請使用放大功能或縮小工具(在時間滑桿下方),或在鍵盤上滾動。使用重置按鈕重置縮放等級。
- 若要查看隨時間變化的跡線分佈的展開視圖,請按一下向上箭頭(右下角)。
圖8.Winscope 上的時間導航。
在展開視圖(圖 9)中,選擇並放大特定時間範圍以便更好地檢查:
圖 9.Winscope上的擴充時間軸。
若要檢查痕跡,您可以透過螢幕錄製查看裝置狀態。要檢查特定跟踪,請單擊工具頂部面板上的相關跟踪選項卡。
對於Surface Flinger跟踪,三個面板顯示給定時間段內跟踪的不同視圖,如圖 10 所示:
圖 10. Winscope 上的 Surface Flinger 追蹤。
圖層視圖:矩形疊加層的 3D 視圖。以下 UI 元素調整矩形以根據其位置、大小、變換和 z 順序呈現圖形元素:
- 旋轉滑桿(「圖層」視圖的左上角)可旋轉分層矩形以選取的角度查看它們。
- 間距滑桿(「圖層」視圖的右上角)可調整圖層之間的間距以建立所選的複合視圖。
- 縮放工具(圖層視圖的右上角)放大並縮小進入各層以便更好檢查。
- 重置按鈕(圖層視圖的右上角)將相機設定恢復到原始視圖。
- 拖曳矩形以方便更好地縮放。
層次結構視圖:完整的層層次結構。
- 「僅可見」 (「層次結構」視圖的右上角)選擇後,會隱藏層次結構中的不可見層,以協助視覺化螢幕上的元素。
- 「平面」 (「層次結構」視圖的右上角)選擇後,會將層次結構顯示為扁平的圖層清單。
- 僅當存在狀態轉換時才選擇「顯示差異」(「層次結構」視圖的左上角)。選擇後,工具會將目前狀態與前一個狀態進行比較。新元素以綠色突出顯示,刪除的元素以紅色突出顯示,修改的元素以藍色突出顯示。
屬性視圖:所選圖層的屬性。 Properties視圖的頂部面板僅包含有關關鍵屬性的信息,例如Visibility 、 Geometry和Buffer 。屬性視圖的底部面板包含所有屬性的原型轉儲。
- 「顯示差異」複選框(「屬性」視圖的左上角)的行為與「層次結構」視圖中的行為相同。
- 顯示預設值(「屬性」視圖的左上角),選擇後會顯示原型轉儲上的預設原型值。預設情況下,這些值不會在原始轉儲中列出。預設的原型值取自原型欄位定義。如果原型欄位沒有設定非空預設值,則顯示的預設原型值為:
- 字串:空
- 數量:0
- 布林值:False
- 物件:空
三個視圖之間的選擇和螢幕錄製是同步的,也就是說,當您導航到不同的時間點時,所有軌跡都會同步更新。若要查看圖層的屬性,請透過在「層次結構」檢視中按一下該圖層或按一下「屬性」檢視中對應的矩形來選取該圖層。紫色矩形表示視圖軌跡附加到該圖層。雙擊紫色圖層時,UI 會導覽至相關視圖追蹤標籤。
對於視窗管理器跟踪,三個面板顯示給定時間段內跟踪的不同視圖,如圖 11 所示:
- 視窗視圖:圖層的 3D 視圖。
- 層次結構視圖:完整的層層次結構。
- 屬性視圖包含所有屬性的原始轉儲。
三個視圖之間的選擇和螢幕錄製是同步的,也就是說,當您導航到不同的時間點時,所有軌跡都會同步更新。
圖 11. Winscope 上的視窗管理器追蹤。
對於事務追蹤,SurfaceFlinger 和視窗管理器之間的事務以表格格式呈現,可透過顯示的 ID、類型和文字以及顯示原始轉儲的屬性視圖進行搜尋。兩個視圖之間的選擇和螢幕錄製是同步的:
圖 12.Winscope上的事務追蹤。
對於ProtoLog追蹤,資訊以表格格式呈現,可透過標籤、原始檔案和文字進行搜尋:
圖 13. Winscope 上的 ProtoLog 追蹤。
對於轉換跟踪,會顯示包含 ID、類型、傳送時間、持續時間和狀態的轉換清單以及所選轉換的屬性:
圖 14. Winscope 上的轉換追蹤。