WindowManager

WindowManager 转储可提供特定时间的 WindowManager 快照。WindowManager 轨迹包含按时间顺序排列的状态,可提供有关窗口在屏幕上显示的原因、其配置或其 activity、任务、显示屏或 WindowManager 层次结构中的任何其他元素的配置的宝贵洞见。这些信息对于排查问题(例如为什么我的应用不可见我在切换应用时遇到了闪烁问题)非常有用。

Winscope 的 WindowManager 查看器会针对轨迹和转储显示此信息。

如需详细了解轨迹收集,请参阅 WindowManager

windowmanager

图 1. WindowManager 轨迹分析。

屏幕左侧显示的是窗户的 3D 视图。矩形视图会考虑窗口边界、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 实例解码为人类可读的格式。例如,2activityType 的 activity 会转换为 ACTIVITY_TYPE_HOMEactivityType。同样,在 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 实例列表。