لقطات مهمة

لقطات المهام هي بنية تحتية تم تقديمها في Android 8.0 تجمع بين لقطات الشاشة للصور المصغرة الحديثة بالإضافة إلى الأسطح المحفوظة من Window Manager. تمثل الصور المصغرة الأخيرة الحالة الأخيرة للمهمة في طريقة العرض الأخيرة.

عندما يصبح النشاط في حالة توقف، لا يقوم Window Manager بتدمير أسطح النشاط طالما كان هذا النشاط في أعلى المهمة. إذا كان لا بد من عرض هذا النشاط مرة أخرى، فقد تمكن Window Manager من بدء الرسوم المتحركة دون انتظار انتهاء النشاط من رسم إطاره الأول، حيث كان قادرًا على استخدام هذا السطح المحفوظ.

بنيان

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

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

فوائد

هناك ثلاث فوائد رئيسية لهذه البنية الجديدة:

  • إذا تم استخدام لقطة المهمة كنافذة بداية، فسيكون هناك تداخل جيد بين اللقطة والمحتوى الحقيقي.
  • عندما يتم رسم لقطة المهمة في SystemUI، يمكن القيام بذلك دون أي نسخ. في السابق، كان يجب نسخ الصورة النقطية إلى Ashmem، ثم إلى ذاكرة الرسومات. وبما أن هذه الطريقة تخزن اللقطة مباشرة في ذاكرة الرسومات، فلا حاجة للنسخ.
  • الحالة التي تراها في التطبيقات الأخيرة تتطابق دائمًا مع الحالة التي ستراها لأول مرة عند إعادة فتح التطبيق. وجود نفس المخزن المؤقت هنا يوفر أيضًا الكثير من الذاكرة. ولهذا السبب أصبح بإمكان تطبيق "Recents" الآن عرض هذه الصور بدقة كاملة. في السابق، تم تخفيض عيناتها بنسبة 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/+/main/services/core/java/com/android/server/wm/