[075]WinScope簡介和使用

背景

最近在搞窗口動畫的工作,通過拍慢鏡頭來分析不夠精準(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í)行以下操作:

  1. 啟用開發(fā)者選項。
  2. 依次轉(zhuǎn)到開發(fā)者選項 > 快捷設(shè)置開發(fā)者圖塊。
  3. 啟用 WinScope 跟蹤。
  4. 打開快捷設(shè)置
  5. 點按 Winscope 跟蹤以啟用跟蹤。
  6. 在設(shè)備上執(zhí)行窗口轉(zhuǎn)換。
  7. 窗口轉(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)用。

  1. 從 Android 源代碼庫中下載預(yù)構(gòu)建的軟件工件:
curl 'https://android.googlesource.com/platform/prebuilts/misc/+/master/common/winscope/winscope.html?format=TEXT' | base64 -d > winscope.html
  1. 在網(wǎng)絡(luò)瀏覽器中打開下載的軟件工件。

  2. 打開 WinScope 后,選擇打開文件以加載跟蹤文件。

3.1 使用 WinScope

在 WinScope 中打開跟蹤文件后,可以通過多種方式對該文件進(jìn)行分析。

winscope_screenshot.png

如圖 在 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)一步的使用,更多功能需要讀者自己去嘗試使用了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容