WindowManager 轉儲作業會提供 WindowManager 在特定時間點的快照。WindowManager 追蹤記錄會以時間順序顯示狀態,提供寶貴的深入分析結果,協助您瞭解為何視窗會顯示在螢幕上、其設定,或其活動、工作、顯示畫面或 WindowManager 階層中的任何其他元素。這項資訊對於排解問題非常實用,例如「為什麼我的應用程式無法顯示」或「我在切換應用程式時看到畫面閃爍」。
Winscope 的 WindowManager 檢視器會針對追蹤記錄和傾印顯示這項資訊。
如要進一步瞭解追蹤記錄收集作業,請參閱 WindowManager。
圖 1. WindowManager 追蹤分析。
畫面左側會顯示窗戶的 3D 檢視畫面。矩形檢視畫面會考量視窗邊界、z 順序和透明度。
分頁的中央區塊會顯示視窗階層。除了視窗、活動和工作之間的父子關係外,這個檢視畫面還包含下列資訊:
- V:識別可見視窗。
畫面右側顯示所有可用屬性的 proto 傾印。如要進一步瞭解 Proto 傾印區段的功能,請參閱「屬性」。
@IntDef 翻譯
@IntDef
轉譯是 WindowManager 屬性面板的重要屬性。@IntDef
表示整數類型的註解元素代表邏輯類型,且其值必須是明確命名的常數之一。@IntDef
會在 Android 程式碼庫中使用,而非在枚舉中使用,以減輕對記憶體和效能的影響。
以下是 @IntDef 用法的範例:
/**
* The modes to control how root task is moved to the front when calling {@link Task#reparent}.
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({
REPARENT_MOVE_ROOT_TASK_TO_FRONT,
REPARENT_KEEP_ROOT_TASK_AT_FRONT,
REPARENT_LEAVE_ROOT_TASK_IN_PLACE
})
@interface ReparentMoveRootTaskMode {}
// Moves the root task to the front if it was not at the front
static final int REPARENT_MOVE_ROOT_TASK_TO_FRONT = 0;
// Only moves the root task to the front if it was focused or frontmost already
static final int REPARENT_KEEP_ROOT_TASK_AT_FRONT = 1;
// Do not move the root task as a part of reparenting
static final int REPARENT_LEAVE_ROOT_TASK_IN_PLACE = 2;
標記會儲存為整數,而不是使用人類可讀的值,這可能很難解讀。Winscope 會使用 @IntDef
定義,將這些旗標轉譯為人類可讀的值。在編譯期間,Winscope 會收集 @IntDef
值的字典,並在執行階段使用這份清單將 @IntDef
例項解碼為人類可讀的格式。舉例來說,如果活動的 activityType
為 2
,就會轉譯為 ACTIVITY_TYPE_HOME
的 activityType
。同樣地,如果視窗含有 flags=2173763840
,Winscope 會將其翻譯為:
flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED |
FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR |
FLAG_LAYOUT_IN_SCREEN
如果 Winscope 無法正確轉譯 @IntDef
例項,請按照「更新 @IntDef 對應」中的步驟,更新 Winscope 已知的 @IntDef
例項清單。