ميزة لقطات المهام هي بنية أساسية تم طرحها في Android 8.0 وتجمع لقطات الشاشة من أجل الصور المصغّرة في "التطبيقات الحديثة" بالإضافة إلى الأسطح المحفوظة من "مدير النوافذ". تمثّل الصور المصغّرة في "التطبيقات الحديثة" آخر حالة لمهمة في طريقة عرض "التطبيقات الحديثة".
عندما ينتقل نشاط إلى حالة متوقفة، لا يحذف "مدير النوافذ" أسطح النشاط طالما كان هذا النشاط في أعلى المهمة. إذا كان يجب عرض هذا النشاط مرة أخرى، كان بإمكان "مدير النوافذ" بدء الرسوم المتحركة بدون انتظار انتهاء النشاط من رسم إطاره الأول، لأنّه كان بإمكانه استخدام هذا السطح المحفوظ.
هندسة معمارية
يتم توحيد مفهومَي الصور المصغّرة في "التطبيقات الحديثة" والأسطح المحفوظة باستخدام ميزة "لقطات المهام". عندما تنتقل مهمة إلى الخلفية، يضع "مدير النوافذ" لقطة شاشة لهذه المهمة في GraphicBuffer. طالما بقي تطبيق النشاط العلوي للمهمة في الذاكرة، سيتم الاحتفاظ بهذا GraphicBuffer في الذاكرة. الآن، عندما يتم عرض النشاط نفسه مرة أخرى، سيُنشئ "مدير النوافذ" نافذة بدء (TaskSnapshotSurface)، ويرفق GraphicBuffer بدون نسخ أي ذاكرة إلى قائمة انتظار المخزن المؤقت لنافذة البدء. بمجرد أن يرسم النشاط إطاره الأول، ستتلاشى نافذة بدء "لقطة المهمة" بسلاسة مثل شاشات البداية العادية.
يتم أيضًا إرسال GraphicBuffer نفسه عبر Binder إلى SystemUI لاستخدامه في رسم حالة المعاينة لمهمة في طريقة عرض "التطبيقات الحديثة". بما أنّ هذا مجرد مرجع إلى مخزن مؤقت، فإنّ إرساله عبر Binder يستهلك القليل من الموارد. عندما يصل GraphicBuffer إلى SystemUI، يتم تضمينه في صورة نقطية للأجهزة، ثم يتم رسمه على الشاشة بدون تحميل أي ذاكرة إلى ذاكرة الرسومات.
المزايا
هناك ثلاث مزايا رئيسية لهذه البنية الجديدة:
- إذا تم استخدام لقطة المهمة كنافذة بدء، يكون هناك انتقال سلس بين اللقطة والمحتوى الفعلي.
- عندما يتم رسم لقطة المهمة في 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/+/android17-release/services/core/java/com/android/server/wm/