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, del suo display 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 notato 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 dei finestrini. 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 alle relazioni padre-figlio tra finestre, attività e task, questa visualizzazione include anche le seguenti informazioni:

  • V: identifica le finestre visibili.

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

@IntDef translation

La traduzione @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 del codebase Android anziché delle enumerazioni 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, 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. Analogamente, 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 @IntDef per aggiornare l'elenco delle istanze @IntDef note a Winscope.