Android 17 से, Android 17 (एपीआई लेवल 37)
या इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन को
android.os.MessageQueue का नया लॉक-फ़्री वर्शन मिलता है. नए वर्शन से परफ़ॉर्मेंस बेहतर होती है और फ़्रेम छूटने की संख्या कम होती है. हालांकि, इससे उन क्लाइंट को समस्या हो सकती है जो MessageQueue के निजी फ़ील्ड और तरीकों को दिखाते हैं.
Android 17 में, Looper और
Handler के काम करने के तरीके में बड़ा बदलाव किया गया है. इसके लिए, MessageQueue क्लास को फिर से लिखा गया है.
Android ऑपरेटिंग सिस्टम के पहले वर्शन से ही, MessageQueue मुख्य थ्रेड की टास्क क्यू को मैनेज करने के लिए, एक लॉक पर निर्भर था. इस डिज़ाइन की वजह से, अक्सर लॉक कॉन्टेंशन की समस्या होती थी. मुख्य थ्रेड को बैकग्राउंड थ्रेड से ब्लॉक किया जा सकता था. इससे फ़्रेम छूट जाते थे और यूज़र इंटरफ़ेस (यूआई) में गड़बड़ी होती थी.
असर कम करना
अगर आपका ऐप्लिकेशन या उसकी डिपेंडेंसी,
रनटाइम रिफ़्लेक्शन पर निर्भर है, तो इस बदलाव का असर आपके ऐप्लिकेशन पर पड़ सकता है.MessageQueue MessageQueue की जांच करने के लिए, रनटाइम रिफ़्लेक्शन का इस्तेमाल न करें.
लेगसी वर्शन में, डेवलपर कभी-कभी MessageQueue.mMessages जैसे निजी फ़ील्ड को ऐक्सेस करके, लंबित मैसेज की जांच करते थे. नए लॉक-फ़्री वर्शन में, इंटरनल डेटा स्ट्रक्चर पूरी तरह से बदल गए हैं.
बाइनरी के साथ काम करने की सुविधा बनाए रखने के लिए, Android 17 में mMessages फ़ील्ड को रखा गया है. हालांकि, नए वर्शन में यह फ़ील्ड हमेशा null होता है. भले ही, क्यू में मैसेज हों या न हों.
इसके अलावा, अगर कुछ लोकप्रिय टेस्टिंग लाइब्रेरी का इस्तेमाल किया जाता है, तो आपको अपनी लाइब्रेरी को नए MessageQueue वर्शन के साथ काम करने के लिए अपडेट करना होगा.
एस्प्रेसो
एस्प्रेसो का इस्तेमाल आम तौर पर यूज़र इंटरफ़ेस (यूआई) की जांच के लिए किया जाता है. Espresso लाइब्रेरी को यह जानने की ज़रूरत होती है कि मुख्य थ्रेड कब आइडल है, ताकि यूज़र इंटरफ़ेस (यूआई) की स्थिति की सही तरीके से पुष्टि की जा सके. Espresso के पुराने वर्शन, रिफ़्लेक्शन तकनीकों पर निर्भर थे. ये तकनीकें, लॉक-फ़्री MessageQueue के साथ अब काम नहीं करती हैं.
कार्रवाई
Espresso 3.7.0 या इसके बाद के वर्शन पर अपडेट करें. इस वर्शन में
TestLooperManager एपीआई का इस्तेमाल किया जाता है. खास तौर पर, Android 16 में लॉन्च किए गए नए एपीआई का इस्तेमाल किया जाता है.
इससे, इंटरनल वर्शन की जानकारी पर निर्भर हुए बिना, Looper के साथ सुरक्षित तरीके से इंटरैक्ट किया जा सकता है.
रोबोइलेक्ट्रिक
इसी तरह, अगर यूनिट टेस्ट करने के लिए Robolectric का इस्तेमाल किया जाता है, तो आपको समस्याएं आ सकती हैं. ऐसा तब होगा, जब आपके टेस्ट, Looper के लेगसी मोड पर निर्भर होंगे.
कार्रवाई
Robolectric 4.17 या इसके बाद के वर्शन पर अपडेट करें. अगर @LooperMode(LEGACY) का इस्तेमाल किया जा रहा है, तो आपको अपने टेस्ट को नए @LooperMode(PAUSED) पर माइग्रेट करना होगा. ज़्यादा जानकारी के लिए,
Robolectric की माइग्रेशन गाइड देखें.
व्यवहार की जांच करना
targetSDK को अपडेट किए बिना, Android 17 पर अपने ऐप्लिकेशन की जांच की जा सकती है. इसके लिए, यह कमांड चलाएं:
adb am compat enable USE_NEW_MESSAGEQUEUE <your-package-name>
अगर आपका ऐप्लिकेशन, डीबग किया जा सकने वाला बिल्ड है, तो इस कमांड से आपके ऐप्लिकेशन में लॉक-फ़्री MessageQueue की सुविधा चालू हो जाती है.
अगर आपका ऐप्लिकेशन, Android 17 (एपीआई लेवल 37) को टारगेट करता है, तो नया वर्शन डिफ़ॉल्ट रूप से चालू होता है. अगर इस एपीआई लेवल को टारगेट करने के बाद, आपको कोई अनचाहा व्यवहार या क्रैश दिखते हैं, तो यह पुष्टि करने के लिए कि इसकी वजह MessageQueue है या नहीं, नए वर्शन को अस्थायी तौर पर बंद किया जा सकता है.
बदलाव को टॉगल करने के लिए, इनमें से कोई एक विकल्प इस्तेमाल किया जा सकता है:
डेवलपर के लिए सेटिंग और टूल में मौजूद, ऐप्लिकेशन के साथ काम करने के लिए किए गए बदलाव मेन्यू.
यह ADB कमांड चलाकर:
adb am compat disable USE_NEW_MESSAGEQUEUE <your-package-name>
इससे आपका ऐप्लिकेशन, लॉक-आधारित लेगसी वर्शन पर वापस आ जाएगा. इससे यह पता लगाया जा सकेगा कि समस्या, मैसेज क्यू के व्यवहार में हुए बदलाव की वजह से हुई है या नहीं.