تقدّم عمليات تفريغ WindowManager لقطة من WindowManager في وقت محدّد. تتضمّن عمليات تتبُّع WindowManager<0x0A> تسلسلاً زمنيًا للحالات التي تقدّم إحصاءات قيّمة حول سبب ظهور نافذة على الشاشة أو إعداداتها أو إعدادات نشاطها أو مهمتها أو شاشتها أو أي عنصر آخر في التسلسل الهرمي لـ WindowManager. تكون هذه المعلومات مفيدة عند تحديد المشاكل وحلّها، مثل لماذا لا يظهر تطبيقي؟ أو حدث وميض عند التبديل بين التطبيقات.
يعرض عارض WindowManager في Winscope هذه المعلومات لكل من عمليات التتبُّع وعمليات التفريغ.
راجِع WindowManager للحصول على مزيد من المعلومات حول جمع عمليات التتبُّع.
الشكل 1. تحليل تتبُّع WindowManager
يعرض الجانب الأيمن من الشاشة عرضًا ثلاثي الأبعاد للنوافذ. تعرض طريقة العرض rects حدود النافذة وترتيبها حسب محور z ودرجة التعتيم.
يعرض القسم الأوسط من علامة التبويب التسلسل الهرمي للنافذة. بالإضافة إلى علاقات الأصل والفرع بين النوافذ والأنشطة والمهام، يتضمّن هذا العرض أيضًا المعلومات التالية:
- V: تحدّد النوافذ المرئية.
يعرض الجانب الأيسر من الشاشة تفريغًا أوليًا لجميع الخصائص المتاحة. لمزيد من المعلومات عن ميزات قسم تفريغ البروتوكول، راجِع الخصائص.
@IntDef translation
@IntDef
الترجمة هي إحدى الخصائص الرئيسية في لوحة خصائص WindowManager.
تشير @IntDef
إلى أنّ العنصر المشروح من النوع الصحيح يمثّل نوعًا منطقيًا ويجب أن تكون قيمته إحدى الثوابت المسماة بشكل صريح.
يتم استخدام @IntDef
ضمن قاعدة رموز Android البرمجية بدلاً من التعدادات لتخفيف التأثير على الذاكرة والأداء.
في ما يلي مثال على استخدام @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.