WindowManager

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

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

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

مدیر پنجره

شکل ۱. تجزیه‌وتحلیل ردپای WindowManager.

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

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

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

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

ترجمه 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 را به‌روزرسانی کنید.