WindowManager

Os despejos do WindowManager fornecem um snapshot do WindowManager em um momento específico. Os rastreamentos do WindowManager apresentam uma sequência cronológica de estados que fornecem insights valiosos sobre por que uma janela aparece na tela, a configuração dela ou da atividade, tarefa, exibição ou de qualquer outro elemento na hierarquia do WindowManager. Essas informações são úteis para resolver problemas como por que meu app não está visível ou a tela ficou piscando ao mudar de app.

O visualizador do WindowManager do Winscope mostra essas informações para rastreamentos e despejos.

Consulte WindowManager para mais informações sobre a coleta de rastreamentos.

windowmanager

Figura 1. Análise de rastreamento do WindowManager.

O lado esquerdo da tela mostra uma visualização 3D das janelas. A visualização de rects considera limites de janela, ordem Z e opacidade.

O segmento central da guia mostra a hierarquia de janelas. Além das relações pai-filho entre janelas, atividades e tarefas, essa visualização também inclui as seguintes informações:

  • V:identifica janelas visíveis.

O lado direito da tela mostra um despejo de proto de todas as propriedades disponíveis. Para mais informações sobre os recursos da seção de despejo de proto, consulte Propriedades.

Tradução de @IntDef

A tradução @IntDef é uma propriedade fundamental do painel de propriedades do WindowManager. @IntDef indica que o elemento anotado do tipo inteiro representa um tipo lógico e que o valor dele precisa ser uma das constantes nomeadas explicitamente. O @IntDef é usado na base de código do Android em vez de enums para reduzir o impacto na memória e no desempenho.

Confira abaixo um exemplo de uso de @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;

As flags são armazenadas como números inteiros, em vez de usar valores legíveis, que podem ser difíceis de interpretar. O Winscope traduz essas flags em valores legíveis usando definições de @IntDef. Durante as compilações, o Winscope coleta um dicionário de valores @IntDef e usa essa lista para decodificar instâncias @IntDef em um formato legível por humanos no tempo de execução. Por exemplo, uma atividade com activityType de 2 é traduzida para activityType de ACTIVITY_TYPE_HOME. Da mesma forma, uma janela com flags=2173763840 é traduzida no Winscope como:

flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED | FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR | FLAG_LAYOUT_IN_SCREEN

Se o Winscope não traduzir uma instância @IntDef corretamente, siga as etapas em Atualizar o mapeamento @IntDef para atualizar a lista de instâncias @IntDef conhecidas pelo Winscope.