背景
最近在搞窗口動畫的工作,通過拍慢鏡頭來分析不夠精準(zhǔn),所以就嘗試使用WinScope。
https://source.android.google.cn/devices/graphics/tracing-win-transitions?hl=cn
一、簡介
WinScope 提供了用于在窗口轉(zhuǎn)換期間和轉(zhuǎn)換后記錄和分析 WindowManager 狀態(tài)和 SurfaceFlinger 狀態(tài)的基礎(chǔ)架構(gòu)和工具。WinScope 將所有相關(guān)的系統(tǒng)服務(wù)狀態(tài)記錄在一個跟蹤文件中,您可以使用該文件重現(xiàn)并逐步查看轉(zhuǎn)換。
二、捕獲跟蹤記錄
在運行 userdebug 或 eng build 的設(shè)備上通過快捷設(shè)置或 adb捕獲跟蹤記錄。
2.1 快捷設(shè)置
要通過快捷設(shè)置記錄跟蹤情況,請執(zhí)行以下操作:
- 啟用開發(fā)者選項。
- 依次轉(zhuǎn)到開發(fā)者選項 > 快捷設(shè)置開發(fā)者圖塊。
- 啟用 WinScope 跟蹤。
- 打開快捷設(shè)置。
- 點按 Winscope 跟蹤以啟用跟蹤。
- 在設(shè)備上執(zhí)行窗口轉(zhuǎn)換。
- 窗口轉(zhuǎn)換完成后,打開快捷設(shè)置,然后點按 Winscope 跟蹤記錄以停用跟蹤記錄。
跟蹤記錄會被寫入 /data/misc/wmtrace/wm_trace.winscope 和 /data/misc/wmtrace/layers_trace.winscope,同時還會包含在錯誤報告中。
2.2 adb
通過 adb 捕獲跟蹤記錄時,請分別捕獲 WindowManager 和 SurfaceFlinger 的跟蹤記錄。
2.2.1 WindowManager 跟蹤記錄
要記錄 WindowManager 的跟蹤情況,請執(zhí)行以下操作:
啟用跟蹤:
adb shell cmd window tracing start
停用跟蹤:
adb shell cmd window tracing stop
獲取跟蹤文件:
adb pull /data/misc/wmtrace/wm_trace.winscope wm_trace.winscope
您可以選擇性地為 WindowManager 跟蹤更改各種設(shè)置的默認(rèn)日志配置:
設(shè)置日志頻率(針對事務(wù)或幀):
adb shell cmd window tracing [frame?|?transaction]
配置日志條目的 Verbose 級別:
adb shell cmd window tracing level [all?|?trim?|?critical]
設(shè)置緩沖區(qū)空間上限(以 KB 為單位):
adb shell cmd window tracing size size-value
轉(zhuǎn)儲緩沖區(qū)狀態(tài)、日志級別、剩余容量和元素數(shù)量:
adb shell cmd window tracing status
2.2.2 SurfaceFlinger 跟蹤
要記錄 SurfaceFlinger 的跟蹤情況,請執(zhí)行以下操作:
啟用跟蹤:
adb shell su root service call SurfaceFlinger 1025 i32 1
停用跟蹤:
adb shell su root service call SurfaceFlinger 1025 i32 0
獲取跟蹤文件:
adb pull /data/misc/wmtrace/layers_trace.winscope layers_trace.winscope
您可以選擇性地為 SurfaceFlinger 跟蹤更改各種設(shè)置的默認(rèn)日志配置:
設(shè)置緩沖區(qū)空間上限(以 KB 為單位):
adb shell su root service call SurfaceFlinger 1029 i32 size-value
配置日志條目的 Verbose 級別:
adb shell su root service call SurfaceFlinger 1033 i32 flags
2.2.3 事務(wù)
如需捕獲事務(wù),請執(zhí)行以下操作:
啟用跟蹤:
adb shell su root service call SurfaceFlinger 1020 i32 1
停用跟蹤:
adb shell su root service call SurfaceFlinger 1020 i32 0
獲取跟蹤文件:
adb pull /data/misc/wmtrace/transaction_trace.winscope
/data/misc/wmtrace/ 中提供了更多事務(wù)合并文件,并采用 transaction_merges_*.winscope 的文件命名方式
2.3 生成狀態(tài)轉(zhuǎn)儲文件
WinScope 可以從錯誤報告中讀取 WindowManager 狀態(tài)和 SurfaceFlinger 狀態(tài)的快照。錯誤報告會將狀態(tài)信息以單獨的 proto 文件的形式存儲在 proto 文件夾中。如需使用 adb 生成狀態(tài)轉(zhuǎn)儲文件,請運行以下命令。
WindowManager
adb exec-out dumpsys window --proto > window_dump.winscope
SurfaceFlinger
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
三、分析軌跡
如需分析軌跡文件,請使用 WinScope Web 應(yīng)用。您可以在源代碼的基礎(chǔ)上構(gòu)建此應(yīng)用,也可以從預(yù)構(gòu)建目錄中打開此應(yīng)用。
- 從 Android 源代碼庫中下載預(yù)構(gòu)建的軟件工件:
curl 'https://android.googlesource.com/platform/prebuilts/misc/+/master/common/winscope/winscope.html?format=TEXT' | base64 -d > winscope.html
在網(wǎng)絡(luò)瀏覽器中打開下載的軟件工件。
打開 WinScope 后,選擇打開文件以加載跟蹤文件。
3.1 使用 WinScope
在 WinScope 中打開跟蹤文件后,可以通過多種方式對該文件進(jìn)行分析。

如圖 在 WinScope 中分析跟蹤記錄
- 時間軸 - 您可以通過時間軸查看跟蹤記錄中的事件序列。您可以使用箭頭鍵或點擊各個條目以瀏覽時間軸。
- 屏幕 - 您可以在屏幕上直觀地查看每個可見窗口。點擊屏幕上的某個窗口即可選擇層次結(jié)構(gòu)中相應(yīng)的源窗口。
- 屏幕錄制 - 您可以通過屏幕錄制查看與跟蹤記錄同步的設(shè)備屏幕。結(jié)合時間軸一起導(dǎo)航。
-
層次結(jié)構(gòu) - 您可以通過層次結(jié)構(gòu)查看系統(tǒng)已知的每個窗口。有些窗口不包含緩沖區(qū),它們存在的目的在于為其子項設(shè)置政策??梢姶翱诰鶚?biāo)有
V圖標(biāo)。 - 屬性 - 您可以在屬性中查看層次結(jié)構(gòu)中所選條目的狀態(tài)信息。
總結(jié)
大體上可以了解WinScope通過將日志轉(zhuǎn)化成了可視化的逐幀分析的界面,我簡單用了一下,遇到了無法解析wm_trace.winscope的問題,也不知道如何開啟屏幕錄制,需要進(jìn)一步的使用,更多功能需要讀者自己去嘗試使用了。