نبذة عن المهام

لقطات المهام هي بنية أساسية تم طرحها في Android 8.0 وتجمع بين لقطات الشاشة للصور المصغّرة في "التطبيقات الحديثة" والأسطح المحفوظة من "مدير النوافذ". تمثّل الصور المصغّرة في قسم "التطبيقات الحديثة" آخر حالة للمهمة في عرض "التطبيقات الحديثة".

عندما ينتقل نشاط إلى حالة متوقّفة، لا يحذف "مدير النوافذ" مساحات العرض الخاصة بالنشاط طالما كان هذا النشاط في أعلى المهمة. إذا كان يجب عرض هذا النشاط مرة أخرى، تمكّن "مدير النوافذ" من بدء الحركة بدون انتظار انتهاء النشاط من رسم الإطار الأول، لأنّه تمكّن من استخدام Saved Surface.

البنية

يتم توحيد مفهومَي "الصور المصغّرة للملفات الحديثة" و"الأسطح المحفوظة" باستخدام "لقطات المهام". عندما تنتقل مهمة إلى الخلفية، يضع "مدير النوافذ" لقطة شاشة لهذه المهمة في GraphicBuffer. وطالما أنّ تطبيق النشاط الأعلى ترتيبًا في المهمة يظل في الذاكرة، سيتم الاحتفاظ بهذا GraphicBuffer في الذاكرة. الآن، عند إعادة عرض النشاط نفسه في المقدّمة، ستنشئ خدمة Window Manager نافذة بدء (TaskSnapshotSurface)، وسترفق بها GraphicBuffer بدون نسخ أي بيانات من الذاكرة إلى قائمة انتظار المخزن المؤقت الخاصة بنافذة البدء. وبمجرد أن يرسم النشاط إطاره الأول، ستتلاشى نافذة بدء "لقطة المهام" بسلاسة مثل شاشات البداية العادية.

يتم أيضًا إرسال GraphicBuffer نفسه عبر Binder إلى SystemUI لاستخدامه في رسم حالة المعاينة لمهمة في "عرض التطبيقات الحديثة". بما أنّ هذا مجرّد مرجع إلى مخزن مؤقت، فإنّ إرساله عبر Binder لا يستهلك سوى القليل من الموارد. عندما يصل GraphicBuffer إلى SystemUI، يتم تضمينه في Bitmap للأجهزة ثم يتم رسمه على الشاشة بدون تحميل أي بيانات إلى ذاكرة الرسومات.

المزايا

تقدّم هذه البنية الجديدة ثلاث مزايا رئيسية:

  • إذا تم استخدام لقطة الشاشة الخاصة بالمهمة كنافذة بدء، سيحدث انتقال سلس بين اللقطة والمحتوى الفعلي.
  • عند رسم لقطة الشاشة الخاصة بالمهمة في SystemUI، يمكن إجراء ذلك بدون أي نسخ. في السابق، كان يجب نسخ الصورة النقطية إلى Ashmem، ثم إلى ذاكرة الرسومات. بما أنّ هذه الطريقة تخزّن اللقطة مباشرةً في ذاكرة الرسومات، لا حاجة إلى نسخها.
  • تتطابق الحالة التي تظهر في "التطبيقات الحديثة" دائمًا مع الحالة التي ستظهر لك عند إعادة فتح التطبيق، كما أنّ توفّر المخزن المؤقت نفسه هنا يؤدي أيضًا إلى توفير الكثير من الذاكرة. لهذا السبب، يمكن الآن عرض هذه الصور بالدقة الكاملة في قسم "الأخيرة". في السابق، كان يتم تقليل عدد العيّنات بنسبة% 64 لتوفير مساحة في الذاكرة.

التنفيذ

تتوفّر هذه الميزة بالكامل على نظام التشغيل Android. لا يلزم إجراء أي عملية دمج، ولا تتوفّر إمكانية التخصيص. ومع ذلك، يمكن لمصنّعي الأجهزة إيقاف ميزة "لقطات المهام" بالكامل.

لإيقاف هذه الميزة، عدِّل هذه الدالة:

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

يُرجى العِلم أنّه في حال إيقاف الميزة، لن يعرض العرض "الملفات الحديثة" أي صور مصغّرة.

لقطات بدقة عالية ومنخفضة

يتم تسجيل لقطات المهام على القرص بمقياسَين. عند استعادة لقطة شاشة لمهمة من القرص، تتم قراءة اللقطات المنخفضة الدقة أولاً، ثم يتم استبدالها باللقطات العالية الدقة. يؤدي هذا التحسين إلى تقليل أوقات تحميل الصور. وبخلاف ذلك، قد يحدث تأخير طفيف عند قراءة ملف اللقطة من القرص، وسيظهر للمستخدم بطاقة مهام فارغة إلى أن تصبح الصورة متاحة. يمكنك ضبط المقاييس في ملف إعداد تراكب الجهاز overlay/frameworks/base/core/res/res/values/config.xml من خلال ضبط config_highResTaskSnapshotScale و config_lowResTaskSnapshotScale. ويتم ضبط هذه القيم تلقائيًا على 1.0 و0.5 على التوالي. يمكنك إيقاف اللقطات المنخفضة الدقة من خلال ضبط config_lowResTaskSnapshotScale على 0.0.

أمثلة ومصدر

يمكنك العثور على بقية الرمز البرمجي لهذه الميزة ضمن ملفات TaskSnapshot* في:

frameworks/base/+/android16-release/services/core/java/com/android/server/wm/