অ্যান্ড্রয়েড ১৭ থেকে শুরু করে, অ্যান্ড্রয়েড ১৭ বা তার উচ্চতর ভার্সনগুলিকে লক্ষ্য করে তৈরি অ্যাপগুলি android.os.MessageQueue এর একটি নতুন লক-মুক্ত বাস্তবায়ন পায়। নতুন বাস্তবায়ন কর্মক্ষমতা উন্নত করে এবং মিস করা ফ্রেমগুলি হ্রাস করে, তবে MessageQueue ব্যক্তিগত ক্ষেত্র এবং পদ্ধতিগুলিতে প্রতিফলিত ক্লায়েন্টগুলিকে ভেঙে ফেলতে পারে।
অ্যান্ড্রয়েড ১৭ Looper এবং Handler কীভাবে কাজ করে তার একটি উল্লেখযোগ্য পরিবর্তন এনেছে, যার জন্য MessageQueue ক্লাসটি পুনর্লিখন করা হয়েছে। অ্যান্ড্রয়েড অপারেটিং সিস্টেমের প্রথম প্রকাশের পর থেকে, MessageQueue মূল থ্রেডের টাস্ক কিউ পরিচালনা করার জন্য একটি একক লকের উপর নির্ভর করত। এই নকশাটি প্রায়শই লক বিতর্কের কারণ হত; মূল থ্রেডটি একটি ব্যাকগ্রাউন্ড থ্রেড দ্বারা ব্লক করা যেতে পারে, যার ফলে ফ্রেমগুলি বাদ পড়ে এবং UI জ্যাঙ্ক তৈরি হয়।
প্রভাব প্রশমিত করুন
আপনার অ্যাপ অথবা এর নির্ভরতা যদি MessageQueue ভেতরে উঁকি দেওয়ার জন্য রানটাইম প্রতিফলনের উপর নির্ভর করে, তাহলে এই পরিবর্তনের ফলে এটি প্রভাবিত হতে পারে। MessageQueue পরিদর্শন করার জন্য রানটাইম প্রতিফলন ব্যবহার করা এড়িয়ে চলুন।
লিগ্যাসি বাস্তবায়নের সাথে সাথে, ডেভেলপাররা মাঝে মাঝে মুলতুবি থাকা বার্তাগুলি পরীক্ষা করার জন্য MessageQueue.mMessages মতো ব্যক্তিগত ক্ষেত্রগুলিতে অ্যাক্সেস করত। নতুন লক-মুক্ত বাস্তবায়নের সাথে, অভ্যন্তরীণ ডেটা কাঠামো সম্পূর্ণরূপে পরিবর্তিত হয়েছে। বাইনারি সামঞ্জস্য বজায় রাখার জন্য, Android 17 mMessages ক্ষেত্রটি রাখে, কিন্তু নতুন বাস্তবায়নে এই ক্ষেত্রটি সর্বদা null থাকে, সারিতে বার্তা থাকুক বা না থাকুক।
এছাড়াও, যদি আপনি কিছু জনপ্রিয় টেস্টিং লাইব্রেরি ব্যবহার করেন, তাহলে নতুন MessageQueue বাস্তবায়নের সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য আপনার লাইব্রেরিগুলি আপডেট করতে হবে।
এসপ্রেসো
এসপ্রেসো সাধারণত UI পরীক্ষার জন্য ব্যবহৃত হয়। UI অবস্থা সঠিকভাবে নির্ধারণ করার জন্য এসপ্রেসো লাইব্রেরিকে জানতে হবে কখন মূল থ্রেডটি নিষ্ক্রিয় থাকে। এসপ্রেসোর পূর্ববর্তী সংস্করণগুলি প্রতিফলন কৌশলের উপর নির্ভর করত যা আর লক-মুক্ত MessageQueue-এর সাথে সামঞ্জস্যপূর্ণ নয়।
অ্যাকশন
Espresso 3.7.0 বা তার পরবর্তী সংস্করণে আপডেট করুন। এই সংস্করণটি TestLooperManager API ব্যবহার করে, বিশেষ করে Android 16 দ্বারা প্রবর্তিত নতুন APIগুলি, অভ্যন্তরীণ বাস্তবায়ন বিবরণের উপর নির্ভর না করেই Looper এর সাথে নিরাপদে ইন্টারঅ্যাক্ট করতে।
রোবোবলেট্রিক
একইভাবে, যদি আপনি Robolectric ব্যবহার করে ইউনিট পরীক্ষা চালান, তাহলে আপনার পরীক্ষাগুলি যদি লিগ্যাসি লুপার মোডের উপর নির্ভর করে তবে আপনি সমস্যার সম্মুখীন হতে পারেন।
অ্যাকশন
Robolectric 4.17 বা তার পরবর্তী সংস্করণে আপডেট করুন। আপনি যদি @LooperMode(LEGACY) ব্যবহার করেন, তাহলে আপনার পরীক্ষাগুলি নতুন @LooperMode(PAUSED) এ স্থানান্তর করতে হবে। আরও তথ্যের জন্য Robolectric এর মাইগ্রেশন নির্দেশিকা দেখুন।
আচরণ পরীক্ষা করুন
আপনি নিম্নলিখিত কমান্ডটি কার্যকর করে targetSDK আপডেট না করেই Android 17-এ আচরণ পরিবর্তনের মাধ্যমে আপনার অ্যাপটি পরীক্ষা করতে পারেন:
adb am compat enable USE_NEW_MESSAGEQUEUE <your-package-name>
এই কমান্ডটি আপনার অ্যাপে লক-মুক্ত MessageQueue সক্ষম করে, যদি এটি একটি ডিবাগযোগ্য বিল্ড হয়।
যদি আপনার অ্যাপটি Android 17-কে টার্গেট করে, তাহলে নতুন আচরণটি ডিফল্টরূপে সক্রিয় থাকে। এই API স্তরটি টার্গেট করার পরে যদি আপনি অপ্রত্যাশিত আচরণ বা ক্র্যাশ লক্ষ্য করেন, তাহলে MessageQueue কারণ কিনা তা যাচাই করার জন্য আপনি নতুন বাস্তবায়নটি সাময়িকভাবে অক্ষম করতে পারেন।
আপনি দুটি বিকল্পের যেকোনো একটি ব্যবহার করে পরিবর্তনটি টগল করতে পারেন:
নিম্নলিখিত ADB কমান্ডটি চালানোর মাধ্যমে:
adb am compat disable USE_NEW_MESSAGEQUEUE <your-package-name>
এটি আপনার অ্যাপটিকে লিগ্যাসি, লক-ভিত্তিক বাস্তবায়নে ফিরিয়ে আনবে, যার ফলে আপনি সনাক্ত করতে পারবেন যে সমস্যাটি মেসেজ কিউ আচরণ পরিবর্তনের ফলে হয়েছে কিনা।