بدءًا من الإصدار 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 على تقنيات الانعكاس التي لم تعُد متوافقة مع 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 هو السبب.
يمكنك التبديل بين الوضعَين باستخدام أحد الخيارَين التاليَين:
من خلال تنفيذ أمر ADB التالي:
adb am compat disable USE_NEW_MESSAGEQUEUE <your-package-name>
سيؤدي ذلك إلى إعادة تطبيقك إلى الإصدار القديم المستند إلى عمليات القفل، ما يتيح لك تحديد ما إذا كانت المشكلة ناتجة عن تغيير في سلوك قائمة انتظار الرسائل.