WindowManager

WindowManager 傾印會提供特定時間的 WindowManager 快照。WindowManager 追蹤記錄會依時間順序顯示狀態,提供寶貴的深入分析結果,協助您瞭解視窗顯示在螢幕上的原因、視窗的設定,或視窗的活動、工作、螢幕,或 WindowManager 階層中任何其他元素的設定。這項資訊有助於排解問題,例如為什麼我的應用程式沒有顯示,或是在應用程式之間切換時發生閃爍情形

Winscope 的 WindowManager 檢視器會顯示追蹤記錄和傾印的這項資訊。

如要進一步瞭解追蹤記錄收集作業,請參閱「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 執行個體解碼為人類可解讀的格式。舉例來說,activityType2 的活動會轉換為 activityTypeACTIVITY_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 執行個體清單。