WindowManager 转储提供特定时间 WindowManager 的快照。WindowManager 跟踪记录了按时间顺序排列的状态序列,可帮助深入了解窗口为何会显示在屏幕上、窗口的配置,或其 Activity、任务、显示屏或 WindowManager 层级结构中任何其他元素的配置。此信息有助于排查问题,例如“我的应用为何不可见”或“在应用之间切换时遇到闪烁”。
Winscope 的 WindowManager 查看器会显示跟踪记录和转储的此信息。
如需详细了解跟踪记录收集,请参阅WindowManager。
图 1. WindowManager 跟踪记录分析。
屏幕左侧是窗口的 3D 视图。“Rects”视图会考虑窗口边界、Z 顺序和不透明度。
标签页的中心部分显示窗口层级结构。除了窗口、Activity 和任务之间的父子关系之外,此视图还包含以下信息:
- 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 会转换为 activityType
为 ACTIVITY_TYPE_HOME
。同样,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
实例列表。