оконный менеджер

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

Средство просмотра WindowManager Winscope отображает эту информацию как для трассировок, так и для дампов.

См. WindowManager для получения дополнительной информации о сборе трассировки.

windowmanager

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

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

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

  • V: Обозначает видимые окна.

В правой части экрана находится прототип всех доступных свойств. Дополнительную информацию о функциях раздела дампа прототипа см. в разделе Свойства .

@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 преобразуется в 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.