إرشادات حول تغيير سلوك MessageQueue

بدءًا من الإصدار 17 من نظام التشغيل Android، تتلقّى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android أو إصدارًا أحدث تنفيذًا جديدًا غير متزامن للدالة android.os.MessageQueue. يحسّن التنفيذ الجديد الأداء ويقلّل من عدد اللقطات التي لم يتم عرضها، ولكن قد يؤدي إلى تعطّل التطبيقات التي تستخدم الحقول والأساليب الخاصة MessageQueue.

يقدّم الإصدار 17 من نظام التشغيل Android عملية إصلاح شاملة لطريقة عمل Looper وHandler، وذلك من خلال إعادة كتابة فئة MessageQueue الأساسية. منذ الإصدار الأول من نظام التشغيل Android، اعتمدت MessageQueue على قفل واحد لإدارة قائمة مهام سلسلة التعليمات الرئيسية. وقد تسبّب هذا التصميم غالبًا في حدوث تعارض على القفل، إذ يمكن أن تحظر سلسلة التعليمات الرئيسية سلسلة تعليمات في الخلفية، ما يؤدي إلى فقدان بعض اللقطات وحدوث تشوّش في واجهة المستخدم.

التخفيف من التأثير

قد يتأثر تطبيقك بهذا التغيير إذا كان يعتمد أو تعتمد تبعياته على انعكاس وقت التشغيل لإلقاء نظرة داخل MessageQueue. تجنَّب استخدام انعكاس وقت التشغيل لفحص MessageQueue.

في الإصدار القديم، كان المطوّرون يصلون أحيانًا إلى الحقول الخاصة، مثل MessageQueue.mMessages، لفحص الرسائل المعلّقة. مع التنفيذ الجديد الذي لا يتطلّب قفل البيانات، تم تغيير هياكل البيانات الداخلية بالكامل. للحفاظ على التوافق الثنائي، يحتفظ الإصدار 17 من نظام التشغيل Android بالحقل mMessages، ولكن في عملية التنفيذ الجديدة، يكون هذا الحقل فارغًا دائمًا، بغض النظر عمّا إذا كانت هناك رسائل في قائمة الانتظار.

بالإضافة إلى ذلك، إذا كنت تستخدم بعض مكتبات الاختبار الشائعة، عليك تعديل مكتباتك لتكون متوافقة مع عملية تنفيذ MessageQueue الجديدة.

Espresso

يُستخدَم Espresso عادةً لاختبار واجهة المستخدم. يجب أن تعرف مكتبة Espresso متى تكون سلسلة التعليمات الرئيسية غير نشطة لكي تتمكّن من تأكيد حالة واجهة المستخدم بشكل صحيح. اعتمدت الإصدارات السابقة من Espresso على تقنيات الانعكاس التي لم تعُد متوافقة مع MessageQueue غير المتزامن.

الإجراء

يجب التحديث إلى Espresso 3.7.0 أو إصدار أحدث. يستخدم هذا الإصدار واجهة برمجة التطبيقات TestLooperManager، وخاصةً واجهات برمجة التطبيقات الجديدة التي تم طرحها في Android 16، للتفاعل بأمان مع Looper بدون الاعتماد على تفاصيل التنفيذ الداخلي.

Robolectric

وبالمثل، إذا كنت تجري اختبارات الوحدات باستخدام Robolectric، قد تواجه مشاكل إذا كانت اختباراتك تعتمد على وضع Looper القديم.

الإجراء

يجب التحديث إلى Robolectric 4.17 أو إصدار أحدث. إذا كنت تستخدم @LooperMode(LEGACY)، عليك نقل اختباراتك إلى @LooperMode(PAUSED) الجديدة. راجِع دليل نقل البيانات في Robolectric لمزيد من المعلومات.

اختبار السلوك

يمكنك اختبار تطبيقك مع تغيير السلوك على Android 17 بدون تحديث targetSDK من خلال تنفيذ الأمر التالي:

adb am compat enable USE_NEW_MESSAGEQUEUE <your-package-name>

يتيح هذا الأمر استخدام MessageQueue بدون قفل في تطبيقك، إذا كان إصدارًا قابلاً للتصحيح.

إذا كان تطبيقك يستهدف الإصدار 17 من نظام التشغيل Android، سيتم تفعيل السلوك الجديد تلقائيًا. إذا لاحظت سلوكًا غير متوقّع أو حدوث أعطال بعد استهداف مستوى واجهة برمجة التطبيقات هذا، يمكنك إيقاف التنفيذ الجديد مؤقتًا للتأكّد مما إذا كان MessageQueue هو السبب.

يمكنك تبديل التغيير باستخدام أحد الخيارَين التاليَين:

  1. قائمة التغييرات في توافق التطبيقات في خيارات المطوّرين

  2. من خلال تنفيذ أمر ADB التالي:

    adb am compat disable USE_NEW_MESSAGEQUEUE <your-package-name>
    

سيؤدي ذلك إلى إعادة تطبيقك إلى الإصدار القديم المستند إلى عمليات القفل، ما يتيح لك تحديد ما إذا كانت المشكلة ناتجة عن تغيير في سلوك قائمة انتظار الرسائل.