Дампы WindowManager предоставляют моментальный снимок WindowManager на определённый момент времени. Трассировки WindowManager представляют собой хронологическую последовательность состояний, которая предоставляет ценную информацию о причине появления окна на экране, его конфигурации, а также о его активности, задаче, отображении или любом другом элементе в иерархии WindowManager. Эта информация полезна для устранения неполадок, например , почему моё приложение не отображается или мерцает при переключении между приложениями .
Просмотрщик WindowManager Winscope отображает эту информацию как для трассировок, так и для дампов.
Дополнительную информацию о сборе трассировок см. в разделе WindowManager.
Рисунок 1. Анализ трассировки WindowManager.
В левой части экрана отображается 3D-изображение окон. Прямоугольное представление учитывает границы окон, 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.