WindowManager

Os despejos da WindowManager fornecem um snapshot da WindowManager em um momento específico. Os rastros do WindowManager têm 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 por que a tela fica piscando ao mudar de app.

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

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

windowmanager

Figura 1. Análise de rastros do WindowManager.

O lado esquerdo da tela mostra 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 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 as janelas visíveis.

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

@IntDef translation

A tradução de @IntDef é uma propriedade importante do painel de propriedades do WindowManager. @IntDef indica que o elemento anotado de 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 tipos enumerados 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 por humanos, que podem ser difíceis de interpretar. O Winscope converte essas flags em valores legíveis por humanos 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 por humanos no tempo de execução. Por exemplo, uma atividade com activityType de 2 é traduzida em 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.