مدير النوافذ

توفّر WindowManager dumps لقطة شاشة لـ WindowManager في وقت محدّد. تعرض عمليات تتبُّع WindowManager تسلسلاً زمنيًا للحالات التي توفّر إحصاءات قيّمة عن سبب ظهور نافذة على الشاشة أو إعداداتها أو إعدادات نشاطها أو مهمتها أو عرضها أو أي عنصر آخر في التسلسل الهرمي لـ WindowManager. تكون هذه المعلومات مفيدة لتحديد المشاكل وحلّها، مثل لماذا لا يظهر تطبيقي أو حدث وميض أثناء التبديل بين التطبيقات.

يعرض عارض WindowManager في Winscope هذه المعلومات لكلّ من عمليات التتبُّع والتجميع.

اطّلِع على WindowManager لمزيد من المعلومات عن جمع عمليات التتبُّع.

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.