WindowManager

WindowManager-Dumps bieten eine Momentaufnahme von WindowManager zu einem bestimmten Zeitpunkt. WindowManager-Traces enthalten eine chronologische Abfolge von Status, die wertvolle Informationen darüber liefern, warum ein Fenster auf dem Bildschirm angezeigt wird, wie es konfiguriert ist oder wie seine Aktivität, sein Task, sein Display oder ein anderes Element in der WindowManager-Hierarchie konfiguriert ist. Diese Informationen sind nützlich, um Probleme wie Warum ist meine App nicht sichtbar? oder Beim Wechseln zwischen Apps ist ein Flackern aufgetreten zu beheben.

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 Segment des Tabs wird die Fensterhierarchie angezeigt. Zusätzlich zu den Eltern-Kind-Beziehungen zwischen 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 Eigenschaften. Weitere Informationen zu den Funktionen des Proto-Dump-Bereichs finden Sie unter Properties.

@IntDef-Übersetzung

@IntDef ist eine wichtige Eigenschaft des Eigenschaftenbereichs von WindowManager. @IntDef gibt an, dass das annotierte Element vom Typ „Ganzzahl“ einen logischen Typ darstellt und sein Wert einer der explizit genannten Konstanten sein muss. @IntDef wird in der Android-Codebasis anstelle von Enums verwendet, um den Speicher- und Leistungseinfluss 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 und nicht als für Menschen lesbare Werte, was die Interpretation erschweren kann. Winscope übersetzt diese Flags mithilfe von @IntDef-Definitionen in für Menschen lesbare Werte. Während der Kompilierung erfasst Winscope ein Dictionary mit @IntDef-Werten und verwendet diese Liste, um @IntDef-Instanzen zur Laufzeit in ein für Menschen lesbares Format zu decodieren. Eine Aktivität mit activityType von 2 wird beispielsweise in activityType von ACTIVITY_TYPE_HOME übersetzt. Ein Fenster mit flags=2173763840 wird 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.