WindowManager-Dumps bieten einen Snapshot des WindowManagers zu einem bestimmten Zeitpunkt. WindowManager-Traces enthalten eine chronologische Abfolge von Status, die wertvolle Informationen dazu liefern, warum ein Fenster auf dem Bildschirm erscheint, wie es konfiguriert ist oder wie es sich bei seiner Aktivität, Aufgabe, Anzeige oder einem anderen Element in der WindowManager-Hierarchie verhält. Diese Informationen sind hilfreich, wenn Sie Probleme beheben möchten, z. B. Warum ist meine App nicht sichtbar? oder Beim Wechseln zwischen Apps tritt ein Flimmern auf.
Der WindowManager-Viewer von Winscope zeigt diese Informationen sowohl für Traces als auch für Dumps an.
Weitere Informationen zur Trace-Erfassung finden Sie unter WindowManager.
Abbildung 1: WindowManager-Trace-Analyse
Auf der linken Seite des Bildschirms sehen Sie eine 3D-Ansicht der Fenster. Bei der Ansicht „rects“ werden Fenstergrenzen, Z-Reihenfolge und Deckkraft berücksichtigt.
Im mittleren Segment des Tabs wird die Fensterhierarchie angezeigt. Neben den übergeordneten und untergeordneten 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 sehen Sie einen Proto-Dump aller verfügbaren Properties. Weitere Informationen zu den Funktionen des Abschnitts „Proto Dump“ finden Sie unter Properties.
@IntDef translation
@IntDef
translation ist eine wichtige Eigenschaft des Properties-Bereichs „WindowManager“.
@IntDef
gibt an, dass das annotierte Element vom Typ „Ganzzahl“ einen logischen Typ darstellt und sein Wert eine der explizit genannten Konstanten sein muss.
@IntDef
wird in der Android-Codebasis anstelle von Enumerationen verwendet, um die Auswirkungen auf Speicher 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 sich nur schwer interpretieren lassen. Winscope übersetzt diese Flags mithilfe von @IntDef
-Definitionen in visuell lesbare Werte.
Während 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
umgewandelt. 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 richtig übersetzt, folgen Sie der Anleitung unter @IntDef-Zuordnung aktualisieren, um die Liste der Winscope bekannten @IntDef
-Instanzen zu aktualisieren.