অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) অ্যান্ড্রয়েড সিস্টেমে বেশ কিছু পরিবর্তন আনে। নিম্নলিখিত আচরণগত পরিবর্তনগুলি কেবলমাত্র সেইসব অ্যাপের ক্ষেত্রে প্রযোজ্য যারা API লেভেল ২৮ বা তার বেশি টার্গেট করে। যেসব অ্যাপ targetSdkVersion API লেভেল ২৮ বা তার বেশিতে সেট করে, তাদের অবশ্যই তাদের অ্যাপগুলিকে এই আচরণগুলিকে সঠিকভাবে সমর্থন করার জন্য পরিবর্তন করতে হবে, যেখানে অ্যাপের ক্ষেত্রে প্রযোজ্য।
Android 9-এ চলমান সমস্ত অ্যাপকে প্রভাবিত করে এমন পরিবর্তনগুলির জন্য, তারা যে API স্তরের লক্ষ্যবস্তুই করুক না কেন, আচরণগত পরিবর্তনগুলি দেখুন: সমস্ত অ্যাপ ।
ফোরগ্রাউন্ড পরিষেবা
যেসব অ্যাপ অ্যান্ড্রয়েড ৯ বা তার পরবর্তী ভার্সনের জন্য কাজ করে এবং ফোরগ্রাউন্ড পরিষেবা ব্যবহার করে, তাদের অবশ্যই FOREGROUND_SERVICE অনুমতির জন্য অনুরোধ করতে হবে। এটি একটি সাধারণ অনুমতি , তাই সিস্টেম স্বয়ংক্রিয়ভাবে অনুরোধকারী অ্যাপটিকে এটি প্রদান করে।
যদি Android 9 বা তার পরবর্তী ভার্সনকে লক্ষ্য করে এমন কোনও অ্যাপ FOREGROUND_SERVICE অনুরোধ না করেই একটি ফোরগ্রাউন্ড পরিষেবা তৈরি করার চেষ্টা করে, তাহলে সিস্টেমটি একটি SecurityException নিক্ষেপ করে।
গোপনীয়তা পরিবর্তন
যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ৯-কে টার্গেট করে, তাহলে আপনার নিম্নলিখিত আচরণগত পরিবর্তনগুলি মনে রাখা উচিত। ডিভাইস সিরিয়াল এবং ডিএনএস তথ্যের এই আপডেটগুলি ব্যবহারকারীর গোপনীয়তা বৃদ্ধি করে।
বিল্ড সিরিয়াল নম্বরের অবচয়
অ্যান্ড্রয়েড ৯-এ, ব্যবহারকারীদের গোপনীয়তা রক্ষা করার জন্য Build.SERIAL সর্বদা "UNKNOWN" এ সেট করা থাকে।
যদি আপনার অ্যাপের কোনও ডিভাইসের হার্ডওয়্যার সিরিয়াল নম্বর অ্যাক্সেস করার প্রয়োজন হয়, তাহলে আপনার READ_PHONE_STATE অনুমতির জন্য অনুরোধ করা উচিত, তারপর getSerial() কল করুন।
ডিএনএস গোপনীয়তা
অ্যান্ড্রয়েড ৯-কে লক্ষ্য করে তৈরি অ্যাপগুলির ব্যক্তিগত DNS API গুলি মেনে চলা উচিত। বিশেষ করে, অ্যাপগুলির নিশ্চিত করা উচিত যে, যদি সিস্টেম রিজলভার DNS-over-TLS করে, তাহলে যেকোনো বিল্ট-ইন DNS ক্লায়েন্ট হয় সিস্টেমের মতো একই হোস্টনেমে এনক্রিপ্ট করা DNS ব্যবহার করে, অথবা সিস্টেম রিজলভারের পক্ষে অক্ষম করা হয়।
ফ্রেমওয়ার্ক নিরাপত্তা পরিবর্তন
অ্যান্ড্রয়েড ৯-এ বেশ কিছু আচরণগত পরিবর্তন অন্তর্ভুক্ত রয়েছে যা আপনার অ্যাপের নিরাপত্তা উন্নত করে, তবে এই পরিবর্তনগুলি কেবল তখনই কার্যকর হবে যখন আপনার অ্যাপটি API লেভেল ২৮ বা তার বেশিকে লক্ষ্য করে।
ডিফল্টরূপে নেটওয়ার্ক TLS সক্রিয় করা হয়েছে
যদি আপনার অ্যাপটি Android 9 বা তার পরবর্তী ভার্সনকে টার্গেট করে, তাহলে isCleartextTrafficPermitted() পদ্ধতিটি ডিফল্টরূপে false রিটার্ন করে। যদি আপনার অ্যাপটিকে নির্দিষ্ট ডোমেনের জন্য cleartext সক্ষম করতে হয়, তাহলে আপনার অ্যাপের নেটওয়ার্ক সিকিউরিটি কনফিগারেশনে সেই ডোমেনগুলির জন্য cleartextTrafficPermitted কে স্পষ্টভাবে true এ সেট করতে হবে।
প্রক্রিয়া দ্বারা পৃথক করা ওয়েব-ভিত্তিক ডেটা ডিরেক্টরিগুলি
অ্যান্ড্রয়েড ৯-এ অ্যাপের স্থিতিশীলতা এবং ডেটা অখণ্ডতা উন্নত করার জন্য, অ্যাপগুলি একাধিক প্রক্রিয়ার মধ্যে একটি একক WebView ডেটা ডিরেক্টরি ভাগ করতে পারে না। সাধারণত, এই ধরনের ডেটা ডিরেক্টরিগুলি কুকিজ, HTTP ক্যাশে এবং ওয়েব ব্রাউজিংয়ের সাথে সম্পর্কিত অন্যান্য স্থায়ী এবং অস্থায়ী স্টোরেজ সংরক্ষণ করে।
বেশিরভাগ ক্ষেত্রে, আপনার অ্যাপের android.webkit প্যাকেজ থেকে ক্লাস ব্যবহার করা উচিত, যেমন WebView এবং CookieManager , শুধুমাত্র একটি প্রক্রিয়ায়। উদাহরণস্বরূপ, আপনার সমস্ত Activity অবজেক্ট যা WebView ব্যবহার করে একই প্রক্রিয়ায় স্থানান্তর করা উচিত। আপনি আপনার অ্যাপের অন্যান্য প্রক্রিয়াগুলিতে disableWebView() কল করে "একটি প্রক্রিয়া মাত্র" নিয়মটি আরও কঠোরভাবে প্রয়োগ করতে পারেন। এই কলটি WebView ভুল করে অন্যান্য প্রক্রিয়াগুলিতে শুরু হতে বাধা দেয়, এমনকি যদি এটি একটি নির্ভরশীল লাইব্রেরি থেকে কল করা হয়।
যদি আপনার অ্যাপকে একাধিক প্রক্রিয়ায় WebView এর ইনস্ট্যান্স ব্যবহার করতে হয়, তাহলে আপনাকে WebView.setDataDirectorySuffix() পদ্ধতি ব্যবহার করে প্রতিটি প্রক্রিয়ার জন্য একটি অনন্য ডেটা ডিরেক্টরি সাফিক্স বরাদ্দ করতে হবে, সেই প্রক্রিয়ায় WebView এর একটি নির্দিষ্ট ইনস্ট্যান্স ব্যবহার করার আগে। এই পদ্ধতিটি প্রতিটি প্রক্রিয়া থেকে ওয়েব ডেটা আপনার অ্যাপের ডেটা ডিরেক্টরির মধ্যে তার নিজস্ব ডিরেক্টরিতে রাখে।
প্রতি-অ্যাপ SELinux ডোমেন
অ্যান্ড্রয়েড ৯ বা তার পরবর্তী ভার্সনের অ্যাপগুলো বিশ্ব-অ্যাক্সেসযোগ্য ইউনিক্স অনুমতি ব্যবহার করে অন্য অ্যাপের সাথে ডেটা শেয়ার করতে পারে না। এই পরিবর্তন অ্যান্ড্রয়েড অ্যাপ্লিকেশন স্যান্ডবক্সের অখণ্ডতা উন্নত করে, বিশেষ করে যে অ্যাপের ব্যক্তিগত ডেটা শুধুমাত্র সেই অ্যাপের মাধ্যমেই অ্যাক্সেসযোগ্য।
অন্যান্য অ্যাপের সাথে ফাইল শেয়ার করতে, একটি কন্টেন্ট প্রোভাইডার ব্যবহার করুন।
সংযোগ পরিবর্তন
সংযোগ তথ্য গণনা এবং মাল্টিপাথ
অ্যান্ড্রয়েড ৯ বা তার উচ্চতর ভার্সনের অ্যাপগুলির মধ্যে, সিস্টেমটি বর্তমান ডিফল্ট নয় এমন নেটওয়ার্কগুলিতে নেটওয়ার্ক ট্র্যাফিক গণনা করে - যেমন ডিভাইসটি ওয়াই-ফাইতে থাকাকালীন সেল ট্র্যাফিক - এবং সেই ট্র্যাফিকের জন্য অনুসন্ধান করার জন্য NetworkStatsManager ক্লাসে পদ্ধতি সরবরাহ করে।
বিশেষ করে, getMultipathPreference() এখন উপরে উল্লিখিত নেটওয়ার্ক ট্র্যাফিকের উপর ভিত্তি করে একটি মান প্রদান করে। Android 9 থেকে শুরু করে, পদ্ধতিটি সেল ডেটার জন্য true প্রদান করে, কিন্তু যখন একটি নির্দিষ্ট পরিমাণের বেশি ট্র্যাফিক একদিনে জমা হয়, তখন এটি false প্রদান করতে শুরু করে। Android 9 এ চলমান অ্যাপগুলিকে অবশ্যই পদ্ধতিটি কল করতে হবে এবং এই ইঙ্গিতটি মেনে চলতে হবে।
ConnectivityManager.NetworkCallback ক্লাস এখন অ্যাপগুলিতে VPN সম্পর্কে তথ্য পাঠায়। এই পরিবর্তনের ফলে অ্যাপগুলির জন্য সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস কল মিশ্রিত না করে এবং সীমিত API ব্যবহার না করেই সংযোগ ইভেন্টগুলি শোনা অনেক সহজ হয়ে যায়। অতিরিক্তভাবে, এর অর্থ হল যখন একটি ডিভাইস একসাথে একাধিক Wi-Fi নেটওয়ার্ক বা একাধিক সেল নেটওয়ার্কের সাথে সংযুক্ত থাকে তখন তথ্য স্থানান্তর প্রত্যাশা অনুযায়ী কাজ করে।
অ্যাপাচি HTTP ক্লায়েন্ট অবচয়
অ্যান্ড্রয়েড ৬.০ এর মাধ্যমে, আমরা অ্যাপাচি HTTP ক্লায়েন্টের জন্য সমর্থন সরিয়ে ফেলেছি । অ্যান্ড্রয়েড ৯ এর মাধ্যমে শুরু করে, সেই লাইব্রেরিটি বুটক্লাসপথ থেকে সরিয়ে ফেলা হয় এবং ডিফল্টরূপে অ্যাপগুলিতে উপলব্ধ থাকে না।
Apache HTTP ক্লায়েন্ট ব্যবহার চালিয়ে যেতে, Android 9 এবং তার পরবর্তী ভার্সনগুলিকে লক্ষ্য করে এমন অ্যাপগুলি তাদের AndroidManifest.xml এ নিম্নলিখিতগুলি যোগ করতে পারে:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
রানটাইম অ্যাপাচি লাইব্রেরি ব্যবহারের বিকল্প হিসেবে, অ্যাপগুলি তাদের APK-তে org.apache.http লাইব্রেরির নিজস্ব সংস্করণ বান্ডিল করতে পারে। যদি আপনি এটি করেন, তাহলে রানটাইমে প্রদত্ত ক্লাসগুলির সাথে ক্লাস সামঞ্জস্যের সমস্যা এড়াতে আপনাকে লাইব্রেরিটি ( Jar Jar এর মতো একটি ইউটিলিটি সহ) পুনরায় প্যাকেজ করতে হবে।
UI পরিবর্তন
ফোকাস দেখুন
০ ক্ষেত্রফল (প্রস্থ অথবা উচ্চতা ০) সহ ভিউ আর ফোকাসযোগ্য নয়।
অতিরিক্তভাবে, কার্যকলাপগুলি আর স্পর্শ-মোডে পরোক্ষভাবে প্রাথমিক ফোকাস বরাদ্দ করে না। পরিবর্তে, যদি ইচ্ছা হয়, তাহলে স্পষ্টভাবে প্রাথমিক ফোকাসের অনুরোধ করা আপনার উপর নির্ভর করে।
CSS RGBA হেক্স মান পরিচালনা
যেসব অ্যাপ অ্যান্ড্রয়েড ৯ বা তার উচ্চতর ভার্সনের জন্য কাজ করে, তাদের ৪ এবং ৮ হেক্স ডিজিটের CSS রঙ পরিচালনার জন্য ড্রাফ্ট CSS কালার মডিউল লেভেল ৪ আচরণ সক্ষম করতে হবে।
সিএসএস কালার মডিউল লেভেল ৪ রিলিজ ৫২ থেকে ক্রোম দ্বারা সমর্থিত, কিন্তু ওয়েবভিউ বর্তমানে এই বৈশিষ্ট্যটি অক্ষম করে কারণ বিদ্যমান অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিতে অ্যান্ড্রয়েড অর্ডারিং (এআরজিবি) তে ৩২ বিট হেক্স রঙ পাওয়া গেছে, যা রেন্ডারিং ত্রুটির কারণ হতে পারে।
উদাহরণস্বরূপ, #80ff8080 রঙটি বর্তমানে WebView- এ 27 বা তার কম API লেভেলের জন্য অস্বচ্ছ হালকা লাল ( #ff8080 ) হিসেবে রেন্ডার করা হয়েছে। প্রধান উপাদানটি (যা Android দ্বারা আলফা উপাদান হিসাবে ব্যাখ্যা করা হবে) বর্তমানে উপেক্ষা করা হচ্ছে। যদি কোনও অ্যাপ্লিকেশন API লেভেল 28 বা তার বেশি লক্ষ্য করে, তাহলে #80ff8080 50% স্বচ্ছ হালকা সবুজ ( #80ff80 ) হিসেবে ব্যাখ্যা করা হবে।
ফাইলের জন্য MIME টাইপ স্নিফিং: URIs
অ্যান্ড্রয়েড ৯-এর আগের অ্যান্ড্রয়েড ভার্সনগুলো ফাইলের কন্টেন্ট থেকে MIME টাইপ অনুমান করতে পারত। অ্যান্ড্রয়েড ৯ (API লেভেল ২৮) থেকে শুরু করে অ্যাপগুলোকে WebView- এ file: URI।
ফাইলের বিষয়বস্তু ব্যবহার করে MIME প্রকার নির্ণয় করা নিরাপত্তা বাগের কারণ হতে পারে, এবং এটি সাধারণত আধুনিক ব্রাউজারগুলিতে অনুমোদিত নয়।
যদি কোন ফাইলের .html , .txt , .js , অথবা .css এর মতো স্বীকৃত ফাইল এক্সটেনশন থাকে, তাহলে MIME টাইপটি এক্সটেনশন দ্বারা নির্ধারিত হবে। যদি কোন ফাইলের কোন এক্সটেনশন না থাকে অথবা অচেনা থাকে, তাহলে MIME টাইপটি প্লেইন টেক্সট হবে।
উদাহরণস্বরূপ, file:///sdcard/test.html মতো একটি URI HTML হিসেবে রেন্ডার করা হবে, কিন্তু file:///sdcard/test এর মতো একটি URI প্লেইন টেক্সট হিসেবে রেন্ডার করা হবে, এমনকি যদি ফাইলটিতে HTML ডেটা থাকে।
ডকুমেন্ট স্ক্রলিং এলিমেন্ট
যেখানে কোনও ডকুমেন্টের রুট এলিমেন্ট স্ক্রলিং এলিমেন্ট হয়, সেখানে অ্যান্ড্রয়েড ৯ সঠিকভাবে পরিচালনা করে। পূর্ববর্তী সংস্করণগুলিতে, বডি এলিমেন্টে স্ক্রলিং পজিশন সেট করা ছিল এবং রুট এলিমেন্টের স্ক্রোল মান শূন্য ছিল। যেখানে স্ক্রলিং এলিমেন্ট রুট এলিমেন্ট হয় , সেখানে অ্যান্ড্রয়েড ৯ স্ট্যান্ডার্ড-সম্মত আচরণ সক্ষম করে।
তাছাড়া, সরাসরি document.body.scrollTop , document.body.scrollLeft , document.documentElement.scrollTop অথবা document.documentElement.scrollLeft অ্যাক্সেস করা টার্গেট SDK এর উপর নির্ভর করে ভিন্নভাবে কাজ করবে। ভিউপোর্ট স্ক্রোল মান অ্যাক্সেস করতে, যদি উপলব্ধ থাকে তবে document.scrollingElement ব্যবহার করুন।
স্থগিত অ্যাপগুলি থেকে বিজ্ঞপ্তি
অ্যান্ড্রয়েড ৯ এর আগে, সাসপেন্ডেড অ্যাপ থেকে বিজ্ঞপ্তি বাতিল করা হয়েছিল। অ্যান্ড্রয়েড ৯ থেকে শুরু করে, অ্যাপটি পুনরায় চালু না হওয়া পর্যন্ত সাসপেন্ডেড অ্যাপ থেকে বিজ্ঞপ্তি লুকানো থাকে।