Gestore finestre

I dump di WindowManager forniscono un'istantanea di WindowManager in un momento specifico. Le tracce di WindowManager includono una sequenza cronologica di stati che forniscono informazioni preziose sul motivo per cui una finestra viene visualizzata sullo schermo, sulla sua configurazione o su quella della sua attività, della sua attività, della sua visualizzazione o di qualsiasi altro elemento nella gerarchia di WindowManager. Queste informazioni sono utili per risolvere problemi come Perché la mia app non è visibile o Ho riscontrato sfarfallio durante il passaggio da un'app all'altra.

Il visualizzatore WindowManager di Winscope mostra queste informazioni sia per le tracce che per i dump.

Per ulteriori informazioni sulla raccolta delle tracce, consulta WindowManager.

windowmanager

Figura 1. Analisi delle tracce di WindowManager.

Sul lato sinistro dello schermo è presente una visualizzazione 3D delle finestre. La visualizzazione dei rettangoli considera i limiti della finestra, l'ordine z e l'opacità.

Il segmento centrale della scheda mostra la gerarchia delle finestre. Oltre ai rapporti tra elementi principali e secondari tra finestre, attività e attività, questa visualizzazione include anche le seguenti informazioni:

  • V: identifica le finestre visibili.

Sul lato destro dello schermo è presente un dump di proto di tutte le proprietà disponibili. Per ulteriori informazioni sulle funzionalità della sezione del dump di proto, consulta Proprietà.

Traduzione di @IntDef

La traduzione @IntDef è una proprietà chiave del riquadro delle proprietà WindowManager. @IntDef indica che l'elemento annotato di tipo intero rappresenta un tipo logico e che il suo valore deve essere una delle costanti denominate esplicitamente. @IntDef viene utilizzato all'interno della base di codice di Android anziché degli enum per ridurre l'impatto su memoria e prestazioni.

Di seguito è riportato un esempio di utilizzo di @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;

I flag vengono memorizzati come numeri interi, anziché utilizzare valori leggibili da persone, che possono essere difficili da interpretare. Winscope traduce questi flag in valori leggibili utilizzando le definizioni @IntDef. Durante le compilazioni, Winscope raccoglie un dizionario di valori @IntDef e utilizza questo elenco per decodificare le istanze @IntDef in un formato leggibile al momento dell'esecuzione. Ad esempio, un'attività con activityType di 2 viene tradotta in activityType di ACTIVITY_TYPE_HOME. Analogamente, una finestra conflags=2173763840 viene tradotta in Winscope come:

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

Se Winscope non traduce correttamente un'istanza @IntDef, segui i passaggi descritti in Aggiornare la mappatura @IntDef per aggiornare l'elenco delle istanze @IntDef conosciute da Winscope.