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

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

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

الحدّ من التأثير

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

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

يمكنك تفعيل التغيير أو إيقافه باستخدام أحد الخيارَين التاليَين:

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

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

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

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