WindowManager

Os dumps do WindowManager fornecem um snapshot do WindowManager em um horário específico. Os traces 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 tive oscilações ao mudar de app.

O visualizador do WindowManager do Winscope mostra essas informações para traces e dumps.

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

windowmanager

Figura 1. Análise de trace do WindowManager.

O lado esquerdo da tela apresenta uma visualização 3D das janelas. A visualização de retângulos considera os limites da janela, a ordem z e a opacidade.

O segmento central da guia mostra a hierarquia da janela. 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 apresenta um proto dump de todas as propriedades disponíveis. Para mais informações sobre os recursos da seção de proto dump consulte Propriedades.

Tradução de @IntDef

A tradução de @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. @IntDef é usado na base de código Android em vez de tipos enumerados para atenuar 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 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 @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 no momento da 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 de @IntDef para atualizar a lista de instâncias @IntDef conhecidas pelo Winscope.