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