WindowManager

Les dumps WindowManager fournissent un instantané de WindowManager à un moment précis. Les traces WindowManager présentent une séquence chronologique d'états qui fournissent des informations précieuses sur la raison pour laquelle une fenêtre apparaît à l'écran, sa configuration ou celle de son activité, de sa tâche, de son affichage ou de tout autre élément de la hiérarchie WindowManager. Ces informations sont utiles pour résoudre des problèmes tels que Pourquoi mon application n'est-elle pas visible ? ou J'ai constaté un scintillement en passant d'une application à une autre.

Le lecteur WindowManager de Winscope affiche ces informations pour les traces et les dumps.

Pour en savoir plus sur la collecte de traces, consultez WindowManager.

windowmanager

Figure 1 : Analyse de trace WindowManager.

Le côté gauche de l'écran affiche une vue 3D des fenêtres. La vue des rectangles tient compte des limites de la fenêtre, de l'ordre Z et de l'opacité.

Le segment central de l'onglet affiche la hiérarchie des fenêtres. En plus des relations parent-enfant entre les fenêtres, les activités et les tâches, cette vue inclut également les informations suivantes :

  • V : identifie les fenêtres visibles.

Sur la droite de l'écran se trouve un dump de proto de toutes les propriétés disponibles. Pour en savoir plus sur les fonctionnalités de la section "Proto dump", consultez Propriétés.

Traduction @IntDef

La traduction @IntDef est une propriété clé du panneau des propriétés WindowManager. @IntDef indique que l'élément annoté de type entier représente un type logique et que sa valeur doit être l'une des constantes nommées explicitement. @IntDef est utilisé dans la base de code Android au lieu des énumérations pour atténuer l'impact sur la mémoire et les performances.

Voici un exemple d'utilisation 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;

Les indicateurs sont stockés sous forme d'entiers, au lieu d'utiliser des valeurs lisibles qui peuvent être difficiles à interpréter. Winscope traduit ces indicateurs en valeurs lisibles à l'aide des définitions @IntDef. Lors des compilations, Winscope collecte un dictionnaire de valeurs @IntDef et utilise cette liste pour décoder les instances @IntDef dans un format lisible par l'humain au moment de l'exécution. Par exemple, une activité avec activityType de 2 est traduite en activityType de ACTIVITY_TYPE_HOME. De même, une fenêtre avec flags=2173763840 est traduite dans Winscope comme suit :

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

Si Winscope ne traduit pas correctement une instance @IntDef, suivez les étapes de la section Mettre à jour le mappage @IntDef pour mettre à jour la liste des instances @IntDef connues par Winscope.