WindowManager

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

نمایشگر WindowManager در Winscope این اطلاعات را هم برای ردگیری‌ها و هم برای داده‌های حذف‌شده نمایش می‌دهد.

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

windowmanager

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

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

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

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

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

ترجمه @IntDef

ترجمه‌ی @IntDef یک ویژگی کلیدی در پنل ویژگی‌های WindowManager است. @IntDef نشان می‌دهد که عنصر حاشیه‌نویسی‌شده از نوع عدد صحیح، یک نوع منطقی را نشان می‌دهد و مقدار آن باید یکی از ثابت‌های با نام صریح باشد. @IntDef در کدبیس اندروید به جای enumها برای کاهش تأثیر بر حافظه و عملکرد استفاده می‌شود.

مثال زیر نحوه‌ی استفاده از @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 به‌روزرسانی شود.