WindowManager

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

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

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

windowmanager

الشكل 1: تحليل عملية تتبُّع WindowManager

يعرض الجانب الأيمن من الشاشة عرضًا ثلاثي الأبعاد للنوافذ. يأخذ عرض المستطيلات في الاعتبار حدود النافذة وترتيبها حسب المحور z ودرجة تعتيمها.

يعرض الجزء المركزي من علامة التبويب التسلسل الهرمي للنافذة. بالإضافة إلى العلاقات بين النوافذ والأنشطة والمهام، يتضمّن هذا العرض أيضًا المعلومات التالية:

  • V: تحدّد النوافذ المرئية.

يعرض الجانب الأيسر من الشاشة عملية تفريغ لبروتوكول جميع الخصائص المتاحة. لمزيد من المعلومات عن ميزات قسم عملية تفريغ البروتوكول، اطّلِع على الخصائص.

ترجمة ‎@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.