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