WindowManager

WindowManager Dumps liefern einen Snapshot von WindowManager zu einem bestimmten Zeitpunkt. WindowManager-Traces enthalten eine chronologische Abfolge von Zuständen, die wertvolle Einblicke in die Gründe dafür geben, warum ein Fenster auf dem Bildschirm angezeigt wird, in seine Konfiguration oder die seiner Aktivität, Aufgabe, Anzeige oder eines anderen Elements in der WindowManager-Hierarchie. Diese Informationen sind nützlich, um Probleme zu beheben, z. B. Warum ist meine App sichtbar oder Beim Wechseln zwischen Apps ist ein Flimmern aufgetreten.

Im WindowManager-Viewer von Winscope werden diese Informationen sowohl für Traces als auch für Dumps angezeigt.

Weitere Informationen zur Trace-Erfassung finden Sie unter WindowManager.

windowmanager

Abbildung 1 : WindowManager-Trace-Analyse.

Auf der linken Seite des Bildschirms wird eine 3D-Ansicht der Fenster angezeigt. In der Ansicht „Rechtecke“ werden Fensterbegrenzungen, Z-Reihenfolge und Deckkraft berücksichtigt.

Im mittleren Bereich des Tabs wird die Fensterhierarchie angezeigt. Neben den Beziehungen zwischen übergeordneten und untergeordneten Fenstern, Aktivitäten und Aufgaben enthält diese Ansicht auch die folgenden Informationen:

  • V:Gibt sichtbare Fenster an.

Auf der rechten Seite des Bildschirms befindet sich ein Proto-Dump aller verfügbaren Attribute. Weitere Informationen zu den Funktionen des Proto-Dump-Bereichs finden Sie unter Attribute.

@IntDef-Übersetzung

Die @IntDef-Übersetzung ist ein wichtiges Attribut des Eigenschaftenbereichs von WindowManager. @IntDef gibt an, dass das annotierte Element vom Typ „Integer“ einen logischen Typ darstellt und dass sein Wert eine der explizit benannten Konstanten sein muss. @IntDef wird im Android-Code anstelle von Enums verwendet, um die Auswirkungen auf Arbeitsspeicher und Leistung zu minimieren.

Hier ein Beispiel für die Verwendung von ` @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;

Flags werden als Ganzzahlen gespeichert, anstatt für Menschen lesbare Werte zu verwenden, die schwer zu interpretieren sein können. Winscope übersetzt diese Flags mithilfe von @IntDef-Definitionen in für Menschen lesbare Werte. Bei der Kompilierung erfasst Winscope ein Wörterbuch mit @IntDef-Werten und verwendet diese Liste, um @IntDef-Instanzen zur Laufzeit in ein für Menschen lesbares Format zu decodieren. Beispiel: Eine Aktivität mit activityType von 2 wird in activityType von ACTIVITY_TYPE_HOME übersetzt. Ebenso wird ein Fenster mit flags=2173763840 in Winscope so übersetzt:

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

Wenn Winscope eine @IntDef-Instanz nicht korrekt übersetzt, folgen Sie der Anleitung unter @IntDef-Zuordnung aktualisieren um die Liste der von Winscope bekannten @IntDef-Instanzen zu aktualisieren.