WindowManager

WindowManager дампы содержат снимок WindowManager на определенный момент времени. Трассировки WindowManager содержат хронологическую последовательность состояний, которая позволяет понять, почему окно появляется на экране, а также узнать его конфигурацию или конфигурацию его действия, задачи, экрана или любого другого элемента в иерархии WindowManager. Эта информация помогает устранять неполадки, например почему не видно мое приложение или почему при переключении между приложениями экран мерцает.

В Winscope эта информация показывается для трассировок и дампов.

Подробнее о сборе трассировок…

windowmanager

Рисунок 1. Анализ трассировки WindowManager.

В левой части экрана показано 3D-изображение окон. В представлении rects учитываются границы окон, порядок наложения и прозрачность.

В центральном сегменте вкладки показана иерархия окон. Помимо иерархической структуры окон, действий и задач, в этом представлении также содержится следующая информация:

  • V – видимые окна.

В правой части экрана находится дамп протокола со всеми доступными свойствами. Подробнее о свойствах…

Перевод @IntDef

@IntDef translation is a key property of the WindowManager properties panel. @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. Аналогично окно с 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, чтобы обновить список экземпляров @IntDef, известных Winscope.