Task Snapshots زیرساختی است که در اندروید ۸.۰ معرفی شده است و تصاویر کوچک مربوط به فعالیتهای اخیر و همچنین سطوح ذخیره شده از Window Manager را با هم ترکیب میکند. تصاویر کوچک فعالیتهای اخیر، آخرین وضعیت یک وظیفه را در نمای Recents نشان میدهند.
وقتی یک فعالیت متوقف میشد، مدیر پنجره سطوح فعالیت را تا زمانی که آن فعالیت در بالای وظیفه بود، از بین نمیبرد. اگر این فعالیت دوباره نمایش داده میشد، مدیر پنجره میتوانست انیمیشن را بدون انتظار برای اتمام ترسیم اولین فریم توسط فعالیت شروع کند، زیرا میتوانست از این سطح ذخیره شده استفاده کند.
معماری
دو مفهوم تصاویر کوچک اخیر و سطوح ذخیره شده با Task Snapshots یکی میشوند. وقتی یک وظیفه به پسزمینه میرود، Window Manager یک تصویر از این وظیفه را در GraphicBuffer قرار میدهد. تا زمانی که برنامه مربوط به فعالیت برتر آن وظیفه در حافظه باقی بماند، این GraphicBuffer نیز در حافظه حفظ خواهد شد. اکنون، وقتی همان فعالیت دوباره به جلو آورده شود، Window Manager یک پنجره شروع (TaskSnapshotSurface) ایجاد میکند و GraphicBuffer را بدون کپی کردن هیچ حافظهای به صف بافر پنجره شروع متصل میکند. به محض اینکه فعالیت اولین فریم خود را ترسیم کرد، پنجره شروع Task Snapshot مانند صفحات شروع معمولی به آرامی محو میشود.
همین GraphicBuffer از طریق Binder به SystemUI ارسال میشود تا برای ترسیم وضعیت پیشنمایش یک وظیفه در نمای Recents استفاده شود. از آنجایی که این فقط یک ارجاع به یک بافر است، ارسال آن از طریق Binder منابع کمی را مصرف میکند. وقتی GraphicBuffer به SystemUI میرسد، در یک Bitmap سختافزاری پیچیده شده و سپس بدون هیچ گونه آپلود حافظهای به حافظه گرافیکی، روی صفحه نمایش ترسیم میشود.
مزایا
این معماری جدید سه مزیت اصلی دارد:
- اگر از تصویر لحظهای وظیفه به عنوان پنجره شروع استفاده شود، یک محوشدگی متقاطع زیبا بین تصویر لحظهای و محتوای واقعی وجود دارد.
- وقتی تصویر لحظهای وظیفه در SystemUI ترسیم میشود، میتوان این کار را بدون هیچ کپی انجام داد. قبلاً بیتمپ باید در Ashmem و سپس در حافظه گرافیکی کپی میشد. از آنجایی که این روش تصویر لحظهای را مستقیماً در حافظه گرافیکی ذخیره میکند، نیازی به کپی کردن نیست.
- حالتی که در Recents میبینید همیشه با حالتی که برای اولین بار هنگام بازگشایی برنامه مشاهده خواهید کرد، مطابقت دارد. داشتن بافر یکسان در اینجا نیز باعث صرفهجویی زیادی در حافظه میشود. به همین دلیل است که Recents اکنون میتواند این تصاویر را با وضوح کامل نشان دهد. پیش از این، برای صرفهجویی در حافظه، ۶۴٪ نمونهبرداری میشد.
پیادهسازی
این ویژگی کاملاً در پلتفرم اندروید وجود دارد. هیچ ادغامی لازم نیست و سفارشیسازی پشتیبانی نمیشود. با این حال، تولیدکنندگان دستگاه میتوانند ویژگی Task Snapshots را به طور کامل غیرفعال کنند.
برای غیرفعال کردن این ویژگی، این تابع را تغییر دهید:
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
توجه داشته باشید که اگر این ویژگی غیرفعال باشد، نمای Recents هیچ تصویر کوچکی را نشان نمیدهد.
عکسهای فوری با وضوح بالا و وضوح پایین
اسنپشاتهای وظیفه در دو مقیاس روی دیسک نوشته میشوند. هنگام بازیابی اسنپشات وظیفه از دیسک، ابتدا اسنپشاتهای کمرزولوشن خوانده میشوند و سپس با معادل پررزولوشن خود جایگزین میشوند. این بهینهسازی زمان بارگذاری تصویر را بهبود میبخشد. در غیر این صورت، ممکن است هنگام خواندن فایل اسنپشات از دیسک کمی تأخیر وجود داشته باشد و کاربر تا زمانی که تصویر در دسترس باشد، یک کارت وظیفه خالی ببیند. میتوانید مقیاسها را در فایل پیکربندی overlay دستگاهoverlay/frameworks/base/core/res/res/values/config.xml با تنظیم config_highResTaskSnapshotScale و config_lowResTaskSnapshotScale پیکربندی کنید. به طور پیشفرض، این مقادیر به ترتیب روی ۱.۰ و ۰.۵ تنظیم شدهاند. اسنپشاتهای کمرزولوشن را با تنظیم config_lowResTaskSnapshotScale روی ۰.۰ غیرفعال کنید.مثالها و منابع
بقیه کد مربوط به این ویژگی را در فایلهای TaskSnapshot* در مسیر زیر بیابید:
frameworks/base/+/android17-release/services/core/java/com/android/server/wm/