WindowManager 傾印會提供特定時間的 WindowManager 快照。WindowManager 追蹤記錄會依時間順序顯示狀態,提供寶貴的深入分析結果,協助您瞭解視窗顯示在螢幕上的原因、視窗的設定,或視窗的活動、工作、螢幕,或 WindowManager 階層中任何其他元素的設定。這項資訊有助於排解問題,例如為什麼我的應用程式沒有顯示,或是在應用程式之間切換時發生閃爍情形。
Winscope 的 WindowManager 檢視器會顯示追蹤記錄和傾印的這項資訊。
如要進一步瞭解追蹤記錄收集作業,請參閱「WindowManager」。
圖 1. WindowManager 追蹤分析。
畫面左側會顯示視窗的 3D 檢視畫面。矩形檢視畫面會考量視窗界線、Z 順序和不透明度。
分頁的中央區段會顯示視窗階層。除了視窗、活動和工作之間的父子關係,這個檢視畫面還包含下列資訊:
- V:識別可見視窗。
畫面右側會顯示所有可用屬性的原型傾印。如要進一步瞭解 proto 傾印區段的功能,請參閱「屬性」。
@IntDef 翻譯
@IntDef
轉換是 WindowManager 屬性面板的重要屬性。
@IntDef
表示整數型別的註解元素代表邏輯型別,且其值必須是明確命名的常數之一。Android 程式碼集會使用 @IntDef
,而非列舉,以減輕記憶體和效能影響。
以下是 @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
的活動會轉換為 activityType
為 ACTIVITY_TYPE_HOME
的活動。同樣地,Winscope 會將具有 flags=2173763840
的視窗翻譯為:
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
執行個體清單。