Android 17 থেকে শুরু করে, Android 17 (API লেভেল 37) বা তার পরবর্তী ভার্সনকে টার্গেট করা অ্যাপগুলি
android.os.MessageQueue-এর একটি নতুন লক-ফ্রি ইমপ্লিমেন্টেশন
পায়। নতুন ইমপ্লিমেন্টেশন পারফর্ম্যান্স উন্নত করে এবং
মিস হওয়া ফ্রেমের সংখ্যা কমায়, তবে MessageQueue-এ প্রতিফলিত হওয়া ক্লায়েন্টদের
ব্যক্তিগত ফিল্ড ও পদ্ধতি ভেঙে দিতে পারে।
Android 17-এ Looper এবং
Handler কীভাবে কাজ করে তা উল্লেখযোগ্যভাবে পরিবর্তন করা হয়েছে, এর জন্য অন্তর্নিহিত MessageQueue ক্লাস আবার লেখা হয়েছে।
Android অপারেটিং সিস্টেমের প্রথম রিলিজ থেকে, MessageQueue মূল থ্রেডের টাস্ক কিউ ম্যানেজ করার জন্য
একটি লকের উপর নির্ভর করে। এই ডিজাইনের কারণে প্রায়ই
লক কনটেনশন হয়; ব্যাকগ্রাউন্ড থ্রেডের মাধ্যমে মূল থ্রেড ব্লক হয়ে যেতে পারে,
যার ফলে ফ্রেম ড্রপ ও UI জ্যাঙ্ক হয়।
প্রভাব কমানো
আপনার অ্যাপ বা এর ডিপেন্ডেন্সি MessageQueue-এর ভিতরে দেখার জন্য রানটাইম রিফ্লেকশন-এর উপর নির্ভর করলে,
এই পরিবর্তনের ফলে আপনার অ্যাপ প্রভাবিত হতে পারে। MessageQueue পরীক্ষা করার জন্য রানটাইম
রিফ্লেকশন ব্যবহার করা এড়িয়ে চলুন।
লেগেসি ইমপ্লিমেন্টেশনের মাধ্যমে, ডেভেলপাররা কখনও কখনও পেন্ডিং মেসেজ চেক করার জন্য
MessageQueue.mMessages-এর মতো ব্যক্তিগত ফিল্ড অ্যাক্সেস করতেন। নতুন
লক-ফ্রি ইমপ্লিমেন্টেশনের মাধ্যমে, ইন্টার্নাল ডেটা স্ট্রাকচার সম্পূর্ণভাবে পরিবর্তিত হয়েছে।
বাইনারি কম্প্যাটিবিলিটি বজায় রাখতে, Android 17-এ mMessages ফিল্ডটি রাখা হয়েছে, তবে
নতুন ইমপ্লিমেন্টেশনে এই ফিল্ডটি সবসময় খালি থাকে, সারিতে মেসেজ
থাকুক বা না থাকুক।
এছাড়াও, আপনি কিছু জনপ্রিয় টেস্টিং লাইব্রেরি ব্যবহার করলে, নতুন MessageQueue ইমপ্লিমেন্টেশনের সাথে মানানসই করার জন্য
আপনার লাইব্রেরি আপডেট করতে হবে।
Espresso
Espresso সাধারণত UI টেস্টিংয়ের জন্য ব্যবহার করা হয়। UI স্টেট সঠিকভাবে অ্যাসার্ট করার জন্য প্রধান থ্রেড কখন আইডল থাকে তা Espresso লাইব্রেরিকে জানতে হবে। Espresso-এর আগের ভার্সনগুলি রিফ্লেকশন টেকনিকের উপর নির্ভর করত যা লক-ফ্রি MessageQueue-এর সাথে আর মানানসই নয়।
অ্যাকশন
Espresso 3.7.0 বা তার পরবর্তী যেকোনও ভার্সনে আপডেট করুন। এই ভার্সনটি
TestLooperManager API ব্যবহার করে, বিশেষ করে Android 16-এ চালু করা নতুন API,
যাতে ইন্টার্নাল ইমপ্লিমেন্টেশনের বিবরণের উপর নির্ভর না করে 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 চালু করে, যদি এটি একটি
ডিবাগ করা যায় এমন বিল্ড হয়।
আপনার অ্যাপ Android 17 (API লেভেল 37) টার্গেট করলে, নতুন আচরণ ডিফল্ট হিসেবে চালু
হয়ে যায়। এই API লেভেল টার্গেট করার পরে আপনি যদি অপ্রত্যাশিত আচরণ বা ক্র্যাশ লক্ষ্য করেন, তাহলে
MessageQueue-এর কারণে এটি হচ্ছে কিনা তা যাচাই করতে আপনি সাময়িকভাবে নতুন প্রয়োগ বন্ধ করতে পারেন।
আপনি দুটি বিকল্পের যেকোনও একটি ব্যবহার করে পরিবর্তন টগল করতে পারবেন:
ডেভেলপার বিকল্প-এর মধ্যে অ্যাপের মানানসই সংক্রান্ত পরিবর্তন মেনু।
নিম্নলিখিত ADB কমান্ড রান করার মাধ্যমে:
adb am compat disable USE_NEW_MESSAGEQUEUE <your-package-name>
এটি আপনার অ্যাপকে লিগ্যাসি, লক-ভিত্তিক ইমপ্লিমেন্টেশনে ফিরিয়ে নিয়ে যায়, যার ফলে আপনি শনাক্ত করতে পারবেন যে মেসেজ কিউয়ের আচরণ পরিবর্তনের ফলে সমস্যাটি হয়েছে কিনা।