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

Рисунок 1. Анализ трассировки WindowManager.
В левой части экрана отображается трехмерное изображение окон. В представлении прямоугольников учитываются границы окна, порядок отображения по оси Z и прозрачность.
Центральная часть вкладки отображает иерархию окон. Помимо взаимосвязей «родитель-потомок» между окнами, действиями и задачами, это представление также включает следующую информацию:
- V: Обозначает видимые окна.
В правой части экрана отображается дамп всех доступных свойств. Для получения дополнительной информации о возможностях раздела дампа см. раздел « Свойства ».
@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 . Аналогично, окно с 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.