קבצים זמניים של WindowManager מספקים תמונת מצב של WindowManager בזמן ספציפי. ב-traces של WindowManager מופיעה רצף כרונולוגי של מצבים שמספקים תובנות חשובות לגבי הסיבות להופעת חלון במסך, ההגדרה שלו או ההגדרה של הפעילות, המשימה, המסך או כל אלמנט אחר בהיררכיה של WindowManager. המידע הזה שימושי לפתרון בעיות כמו למה האפליקציה שלי לא מוצגת או המסך מהבהב בזמן המעבר בין אפליקציות.
המידע הזה מוצג גם ב-traces וגם ב-dumps בתצוגה של WindowManager ב-Winscope.
מידע נוסף על איסוף נתוני מעקב זמין במאמר WindowManager.
איור 1. ניתוח נתוני המעקב של WindowManager.
בצד ימין של המסך מוצגת תצוגת תלת-ממד של החלונות. התצוגה של ה-rects מביאה בחשבון את גבולות החלון, סדר z ושקיפות.
בקטע המרכזי של הכרטיסייה מוצגת היררכיית החלונות. בנוסף ליחסי הורה-צאצא בין חלונות, פעילויות ומשימות, התצוגה הזו כוללת גם את המידע הבא:
- V: מזהה חלונות גלויים.
בצד שמאל של המסך מוצג dump של proto של כל המאפיינים הזמינים. מידע נוסף על התכונות של הקטע proto dump מופיע בקטע מאפיינים.
תרגום של @IntDef
התרגום של @IntDef
הוא מאפיין מפתח בחלונית הנכסים של WindowManager.
הערך @IntDef
מציין שהרכיב המתויג מסוג מספר שלם מייצג סוג לוגי, ושערכו חייב להיות אחד מהקבועים שצוינו במפורש.
@IntDef
משמש בקוד של Android במקום ב-enums כדי לצמצם את ההשפעה על הזיכרון ועל הביצועים.
דוגמה לשימוש ב-@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;
הדגלים מאוחסנים כמספרים שלמים, במקום להשתמש בערכים שניתנים לקריאה על ידי בני אדם, שעשויים להיות קשים לפענוח. Winscope מתרגם את הדגלים האלה לערכים שקריאים לבני אדם באמצעות הגדרות @IntDef
.
במהלך הידור, Winscope אוסף מילון של ערכים של @IntDef
ומשתמש ברשימה הזו כדי לפענח את המופעים של @IntDef
לפורמט שאפשר לקרוא על ידי בני אדם בזמן הריצה. לדוגמה, פעילות עם activityType
מתוך 2
תועבר ל-activityType
מתוך ACTIVITY_TYPE_HOME
. באופן דומה, חלון עם הערך flags=2173763840
מתורגם ב-Winscope כ:
flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED |
FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR |
FLAG_LAYOUT_IN_SCREEN
אם Winscope לא מתרגם מכונה של @IntDef
בצורה נכונה, צריך לפעול לפי השלבים שמפורטים בקטע עדכון המיפוי של @IntDef כדי לעדכן את רשימת המכונות של @IntDef
שידועות ל-Winscope.