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

بدءًا من الإصدار 17 من نظام التشغيل Android، تتلقّى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث تنفيذًا جديدًا غير متزامن للدالة 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 (المستوى 37 لواجهة برمجة التطبيقات)، سيتم تفعيل السلوك الجديد تلقائيًا. إذا لاحظت سلوكًا غير متوقّع أو حدوث أعطال بعد استهداف مستوى واجهة برمجة التطبيقات هذا، يمكنك إيقاف التنفيذ الجديد مؤقتًا للتأكّد مما إذا كان MessageQueue هو السبب.

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

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

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

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

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