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.
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.