WindowManager

تخلیه WindowManager یک عکس فوری از WindowManager در یک زمان خاص ارائه می دهد. ردیابی های WindowManager دارای توالی زمانی از حالت ها هستند که بینش های ارزشمندی را در مورد اینکه چرا یک پنجره روی صفحه نمایش داده می شود، پیکربندی آن، یا فعالیت، وظیفه، نمایش یا هر عنصر دیگری در سلسله مراتب WindowManager ارائه می دهد. این اطلاعات برای عیب‌یابی مشکلاتی مانند اینکه چرا برنامه من قابل مشاهده نیست یا هنگام تغییر بین برنامه‌ها دچار سوسو زدن شدم، مفید است.

نمایشگر WindowManager Winscope این اطلاعات را هم برای ردیابی و هم برای تخلیه نمایش می دهد.

برای اطلاعات بیشتر در مورد جمع آوری ردیابی به WindowManager مراجعه کنید.

windowmanager

شکل 1. تحلیل ردیابی WindowManager.

سمت چپ صفحه نمایش دارای نمای سه بعدی از پنجره ها است. نمای rects مرزهای پنجره، مرتبه z و کدورت را در نظر می گیرد.

بخش مرکزی برگه سلسله مراتب پنجره را نشان می دهد. علاوه بر روابط والدین و فرزند بین پنجره‌ها، فعالیت‌ها و وظایف، این دیدگاه شامل اطلاعات زیر نیز می‌شود:

  • V: پنجره های قابل مشاهده را شناسایی می کند.

در سمت راست صفحه نمایش یک نمونه اولیه از تمام ویژگی های موجود است. برای اطلاعات بیشتر در مورد ویژگی‌های بخش proto dump به Properties مراجعه کنید.

ترجمه @IntDef

ترجمه @IntDef یکی از ویژگی های کلیدی پانل ویژگی های WindowManager است. @IntDef نشان می دهد که عنصر حاشیه نویسی شده از نوع عدد صحیح یک نوع منطقی را نشان می دهد و مقدار آن باید یکی از ثابت های نامگذاری شده صریح باشد. @IntDef در پایگاه کد اندروید به جای 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 را به‌روزرسانی کنید.