WindowManager

I dump di WindowManager forniscono uno snapshot di WindowManager in un momento specifico. Le tracce di WindowManager presentano 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à, del suo task, 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 uno sfarfallio durante il passaggio da un'app all'altra.

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

Per ulteriori informazioni sulla raccolta delle tracce, consulta WindowManager.

windowmanager

Figura 1. Analisi delle tracce di WindowManager.

Il lato sinistro dello schermo mostra una visualizzazione 3D delle finestre. La visualizzazione dei rettangoli considera i limiti, l'ordine Z e l'opacità delle finestre.

Il segmento centrale della scheda mostra la gerarchia delle finestre. Oltre alle relazioni padre-figlio tra finestre, attività e task, questa visualizzazione include anche le seguenti informazioni:

  • V: identifica le finestre visibili.

Il lato destro dello schermo mostra un dump proto di tutte le proprietà disponibili. Per ulteriori informazioni sulle funzionalità della sezione di dump proto consulta Proprietà.

Traduzione di @IntDef

La traduzione di @IntDef è una proprietà chiave del riquadro delle proprietà di 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 in modo esplicito. @IntDef viene utilizzato all'interno della codebase Android anziché degli enum per mitigare l'impatto sulla memoria e sulle 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, 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 in fase di runtime. Ad esempio, un'attività con activityType di 2 viene tradotta in activityType di ACTIVITY_TYPE_HOME. Allo stesso modo, una finestra con flags=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 il mapping di @IntDef per aggiornare l'elenco delle istanze @IntDef note a Winscope.