عکس های فوری از وظایف

Task Snapshots زیرساخت معرفی شده در اندروید 8.0 است که اسکرین شات ها را برای عکس های کوچک اخیر و همچنین سطوح ذخیره شده از Window Manager ترکیب می کند. Recents Thumbnails آخرین وضعیت یک کار را در نمای Recents نشان می دهد.

وقتی یک فعالیت به حالت توقف می‌رود، مدیر پنجره تا زمانی که آن فعالیت در بالای کار بود، سطوح فعالیت را از بین نمی‌برد. اگر این اکتیویتی باید دوباره نشان داده می‌شد، Window Manager می‌توانست انیمیشن را بدون منتظر ماندن تا پایان ترسیم اولین فریم آن شروع کند، زیرا می‌توانست از این Saved Surface استفاده کند.

معماری

دو مفهوم Recents Thumbnails و Saved Surfaces با Task Snapshot یکی شده اند. هنگامی که یک کار به پس زمینه می رود، Window Manager یک اسکرین شات از این کار را در GraphicBuffer قرار می دهد. تا زمانی که برنامه فعالیت برتر کار در حافظه باقی بماند، این GraphicBuffer در حافظه باقی خواهد ماند. اکنون، هنگامی که همان فعالیت دوباره به جلو آورده می شود، Window Manager یک پنجره شروع (TaskSnapshotSurface) ایجاد می کند و GraphicBuffer را بدون کپی کردن هیچ حافظه ای به صف بافر پنجره شروع متصل می کند. به محض اینکه فعالیت اولین فریم خود را ترسیم کرد، پنجره شروع Task Snapshot به آرامی مانند صفحه‌های پخش معمولی محو می‌شود.

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

مزایا

سه مزیت اصلی برای این معماری جدید وجود دارد:

  • اگر عکس فوری کار به عنوان یک پنجره شروع استفاده شود، یک تلاقی خوب بین عکس فوری و محتوای واقعی وجود دارد.
  • هنگامی که عکس فوری کار در SystemUI ترسیم می شود، می توان آن را بدون هیچ کپی انجام داد. قبلاً بیت مپ باید در Ashmem و سپس در حافظه گرافیکی کپی می شد. از آنجایی که این روش عکس فوری را مستقیماً در حافظه گرافیکی ذخیره می کند، نیازی به کپی نیست.
  • وضعیتی که در Recents می بینید همیشه با وضعیتی که برای اولین بار هنگام باز کردن مجدد برنامه مشاهده می کنید مطابقت دارد. وجود بافر یکسان در اینجا نیز باعث صرفه جویی زیادی در حافظه می شود. به همین دلیل Recents اکنون قادر است این تصاویر را با وضوح کامل نشان دهد. قبلاً برای صرفه جویی در حافظه 64 درصد نمونه برداری شده بود.

پیاده سازی

این ویژگی به طور کامل در پلتفرم اندروید وجود دارد. نیازی به یکپارچه سازی نیست و سفارشی سازی پشتیبانی نمی شود. با این حال، سازندگان دستگاه می توانند ویژگی Task Snapshots را به طور کامل غیرفعال کنند.

برای غیرفعال کردن این ویژگی، این تابع را تغییر دهید:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

توجه داشته باشید که اگر این ویژگی غیرفعال باشد، نمای Recents هیچ تصویر کوچکی را نشان نخواهد داد.

عکس های فوری با وضوح بالا و کم وضوح

عکس های فوری وظیفه در دو مقیاس روی دیسک نوشته می شوند. هنگام بازیابی یک عکس فوری از دیسک، عکس‌های فوری با رزولوشن پایین ابتدا خوانده می‌شوند و سپس با همتای با وضوح بالا جایگزین می‌شوند. این بهینه سازی زمان بارگذاری تصویر را بهبود می بخشد. در غیر این صورت، ممکن است هنگام خواندن فایل عکس فوری از روی دیسک، کمی تأخیر ایجاد شود و کاربر تا زمانی که تصویر در دسترس باشد، یک کارت وظیفه خالی را ببیند. می‌توانید با تنظیم config_highResTaskSnapshotScale و config_lowResTaskSnapshotScale ، مقیاس‌ها را در فایل پیکربندی پوشش دستگاه overlay/frameworks/base/core/res/res/values/config.xml پیکربندی کنید. به طور پیش فرض، این ها به ترتیب روی 1.0 و 0.5 تنظیم شده اند. با تنظیم config_lowResTaskSnapshotScale روی 0.0، عکس های فوری با وضوح پایین را غیرفعال کنید.

مثال ها و منبع

بقیه کدهای این ویژگی را در فایل‌های TaskSnapshot* در زیر بیابید:

frameworks/base/+/main/services/core/java/com/android/server/wm/