আচরণ পরিবর্তন: সমস্ত অ্যাপ্লিকেশন

অ্যান্ড্রয়েড ১০-এ এমন কিছু আচরণগত পরিবর্তন রয়েছে যা আপনার অ্যাপকে প্রভাবিত করতে পারে। এই পৃষ্ঠায় তালিকাভুক্ত পরিবর্তনগুলি আপনার অ্যাপের targetSdkVersion নির্বিশেষে, অ্যান্ড্রয়েড ১০-এ চলার সময় আপনার অ্যাপের ক্ষেত্রে প্রযোজ্য হবে। এই পরিবর্তনগুলিকে সঠিকভাবে সমর্থন করার জন্য আপনার অ্যাপটি পরীক্ষা করা এবং প্রয়োজন অনুযায়ী সংশোধন করা উচিত।

আপনার অ্যাপের targetSdkVersion যদি 29 বা তার বেশি হয়, তাহলে আপনাকে অতিরিক্ত পরিবর্তনগুলোও সমর্থন করতে হবে। বিস্তারিত জানতে, 29 টার্গেট করা অ্যাপগুলোর আচরণগত পরিবর্তনগুলো অবশ্যই পড়ুন।

দ্রষ্টব্য: এই পৃষ্ঠায় তালিকাভুক্ত পরিবর্তনগুলি ছাড়াও, অ্যান্ড্রয়েড ১০ বিপুল সংখ্যক গোপনীয়তা-ভিত্তিক পরিবর্তন এবং বিধিনিষেধ নিয়ে এসেছে, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:

  • ডিভাইসের অবস্থানে ব্যাকগ্রাউন্ড অ্যাক্সেস
  • পটভূমির কার্যকলাপ শুরু হয়
  • যোগাযোগের সখ্যতা তথ্য
  • MAC ঠিকানা র‍্যান্ডমাইজেশন
  • ক্যামেরার মেটাডেটা
  • অনুমতি মডেল

এই পরিবর্তনগুলি সমস্ত অ্যাপের ক্ষেত্রে প্রযোজ্য এবং ব্যবহারকারীর গোপনীয়তা বৃদ্ধি করে। এই পরিবর্তনগুলিকে কীভাবে সমর্থন করবেন সে সম্পর্কে আরও জানতে, গোপনীয়তা পরিবর্তন পৃষ্ঠাটি দেখুন।

নন-এসডিকে ইন্টারফেস সীমাবদ্ধতা

অ্যাপের স্থিতিশীলতা এবং সামঞ্জস্যতা নিশ্চিত করতে সাহায্য করার জন্য, প্ল্যাটফর্মটি অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) থেকে আপনার অ্যাপ কোন কোন নন-এসডিকে ইন্টারফেস ব্যবহার করতে পারবে তার উপর সীমাবদ্ধতা আরোপ করা শুরু করে। অ্যান্ড্রয়েড ডেভেলপারদের সাথে সহযোগিতা এবং সর্বশেষ অভ্যন্তরীণ পরীক্ষার উপর ভিত্তি করে অ্যান্ড্রয়েড ১০-এ সীমাবদ্ধ নন-এসডিকে ইন্টারফেসের হালনাগাদ তালিকা অন্তর্ভুক্ত করা হয়েছে। আমাদের লক্ষ্য হলো, নন-এসডিকে ইন্টারফেস সীমাবদ্ধ করার আগে পাবলিক বিকল্পগুলো উপলব্ধ আছে কিনা তা নিশ্চিত করা।

আপনি যদি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) টার্গেট না করেন, তাহলে এই পরিবর্তনগুলোর কিছু হয়তো আপনাকে তাৎক্ষণিকভাবে প্রভাবিত করবে না। তবে, যদিও আপনি বর্তমানে কিছু নন-এসডিকে ইন্টারফেস ব্যবহার করতে পারেন ( যা আপনার অ্যাপের টার্গেট এপিআই লেভেলের উপর নির্ভর করে ), যেকোনো নন-এসডিকে মেথড বা ফিল্ড ব্যবহার করলে আপনার অ্যাপটি ভেঙে যাওয়ার ঝুঁকি সবসময়ই অনেক বেশি থাকে।

আপনার অ্যাপ নন-এসডিকে ইন্টারফেস ব্যবহার করে কিনা, সে বিষয়ে আপনি অনিশ্চিত থাকলে, তা জানার জন্য আপনার অ্যাপটি পরীক্ষা করে দেখতে পারেন। যদি আপনার অ্যাপ নন-এসডিকে ইন্টারফেসের উপর নির্ভরশীল হয়, তবে আপনার এসডিকে বিকল্পগুলিতে স্থানান্তরের পরিকল্পনা শুরু করা উচিত। তা সত্ত্বেও, আমরা বুঝি যে কিছু অ্যাপের ক্ষেত্রে নন-এসডিকে ইন্টারফেস ব্যবহারের যৌক্তিক কারণ থাকে। যদি আপনি আপনার অ্যাপের কোনো ফিচারের জন্য নন-এসডিকে ইন্টারফেস ব্যবহারের কোনো বিকল্প খুঁজে না পান, তবে আপনার একটি নতুন পাবলিক এপিআই-এর জন্য অনুরোধ করা উচিত।

আরও জানতে, Android 10-এ নন-এসডিকে ইন্টারফেস সীমাবদ্ধতার আপডেট এবং নন-এসডিকে ইন্টারফেসের উপর সীমাবদ্ধতা দেখুন।

অঙ্গভঙ্গি নেভিগেশন

অ্যান্ড্রয়েড ১০ থেকে শুরু করে, ব্যবহারকারীরা ডিভাইস জুড়ে জেসচার নেভিগেশন চালু করতে পারবেন। যদি কোনো ব্যবহারকারী জেসচার নেভিগেশন চালু করেন, তবে এটি ডিভাইসের সমস্ত অ্যাপকে প্রভাবিত করে, অ্যাপটি এপিআই লেভেল ২৯ টার্গেট করুক বা না করুক। উদাহরণস্বরূপ, যদি ব্যবহারকারী স্ক্রিনের প্রান্ত থেকে সোয়াইপ করেন, তবে সিস্টেম সেই জেসচারটিকে একটি ব্যাক নেভিগেশন হিসাবে ব্যাখ্যা করে, যদি না কোনো অ্যাপ বিশেষভাবে স্ক্রিনের নির্দিষ্ট অংশের জন্য সেই জেসচারটিকে ওভাররাইড করে

আপনার অ্যাপকে জেসচার নেভিগেশনের সাথে সামঞ্জস্যপূর্ণ করতে, আপনাকে অ্যাপের কন্টেন্ট এক প্রান্ত থেকে অন্য প্রান্ত পর্যন্ত প্রসারিত করতে হবে এবং সাংঘর্ষিক জেসচারগুলো যথাযথভাবে পরিচালনা করতে হবে। এ বিষয়ে তথ্যের জন্য, জেসচার নেভিগেশন ডকুমেন্টেশন দেখুন।

এনডিকে

অ্যান্ড্রয়েড ১০-এ নিম্নলিখিত এনডিকে পরিবর্তনগুলো অন্তর্ভুক্ত রয়েছে।

শেয়ার করা অবজেক্টে টেক্সট রিলোকেশন থাকতে পারে না

অ্যান্ড্রয়েড ৬.০ (এপিআই লেভেল ২৩) শেয়ার্ড অবজেক্টে টেক্সট রিলোকেশন ব্যবহার নিষিদ্ধ করেছে । কোড অবশ্যই হুবহু লোড করতে হবে এবং এটি পরিবর্তন করা যাবে না। এই পরিবর্তনটি অ্যাপ লোড হওয়ার সময় এবং নিরাপত্তা উন্নত করে।

SELinux অ্যান্ড্রয়েড ১০ বা তার উচ্চতর সংস্করণকে লক্ষ্য করে তৈরি অ্যাপগুলোর উপর এই বিধিনিষেধটি প্রয়োগ করে। যদি এই অ্যাপগুলো টেক্সট রিলোকেশনযুক্ত শেয়ার্ড অবজেক্ট ব্যবহার করা অব্যাহত রাখে, তবে সেগুলো ভেঙে যাওয়ার উচ্চ ঝুঁকি থাকে।

বায়োনিক লাইব্রেরি এবং ডায়নামিক লিঙ্কার পাথে পরিবর্তন

অ্যান্ড্রয়েড ১০ থেকে, বেশ কিছু পাথ সাধারণ ফাইলের পরিবর্তে সিম্বলিক লিঙ্ক হিসেবে ব্যবহৃত হচ্ছে। যেসব অ্যাপ এই পাথগুলোকে সাধারণ ফাইল হিসেবে ব্যবহারের ওপর নির্ভরশীল ছিল, সেগুলো কাজ করা বন্ধ করে দিতে পারে:

  • /system/lib/libc.so -> /apex/com.android.runtime/lib/bionic/libc.so
  • /system/lib/libm.so -> /apex/com.android.runtime/lib/bionic/libm.so
  • /system/lib/libdl.so -> /apex/com.android.runtime/lib/bionic/libdl.so
  • /system/bin/linker -> /apex/com.android.runtime/bin/linker

এই পরিবর্তনগুলি ফাইলটির ৬৪-বিট সংস্করণগুলির ক্ষেত্রেও প্রযোজ্য, যেখানে lib/ এর পরিবর্তে lib64/ ব্যবহৃত হয়েছে।

সামঞ্জস্য রক্ষার জন্য, সিমলিঙ্কগুলো পুরোনো পাথেই দেওয়া হয়েছে। উদাহরণস্বরূপ, /system/lib/libc.so হলো /apex/com.android.runtime/lib/bionic/libc.so এর একটি সিমলিঙ্ক। তাই dlopen(“/system/lib/libc.so”) কাজ করতে থাকে, কিন্তু অ্যাপগুলো যখন /proc/self/maps বা এই জাতীয় পাথ পড়ে লোড হওয়া লাইব্রেরিগুলো পরীক্ষা করার চেষ্টা করে, তখন তারা পার্থক্যটি বুঝতে পারে। এটি সাধারণত ঘটে না, কিন্তু আমরা দেখেছি যে কিছু অ্যাপ তাদের অ্যান্টি-হ্যাকিং প্রক্রিয়ার অংশ হিসেবে এমনটা করে থাকে। যদি তাই হয়, তাহলে /apex/… পাথগুলোকে Bionic ফাইলগুলোর জন্য বৈধ পাথ হিসেবে যোগ করা উচিত।

সিস্টেম বাইনারি/লাইব্রেরিগুলো শুধুমাত্র কার্যকর করার মেমরিতে ম্যাপ করা হয়েছে

অ্যান্ড্রয়েড ১০ থেকে, কোড-পুনর্ব্যবহার আক্রমণের বিরুদ্ধে একটি সুরক্ষা ব্যবস্থা হিসেবে সিস্টেম বাইনারি এবং লাইব্রেরির এক্সিকিউটেবল সেগমেন্টগুলোকে শুধুমাত্র-কার্যকর (অপাঠ্য) মেমরিতে ম্যাপ করা হয়। যদি আপনার অ্যাপ কোনো বাগ, দুর্বলতা বা ইচ্ছাকৃত মেমরি পরিদর্শনের কারণে শুধুমাত্র-কার্যকর হিসেবে চিহ্নিত মেমরি সেগমেন্টে রিড অপারেশন চালায়, তাহলে সিস্টেম আপনার অ্যাপে একটি SIGSEGV সিগন্যাল পাঠায়।

এই আচরণের কারণে কোনো ক্র্যাশ হয়েছে কিনা তা আপনি /data/tombstones/ -এ থাকা সংশ্লিষ্ট টুম্বস্টোন ফাইলটি পরীক্ষা করে শনাক্ত করতে পারেন। শুধুমাত্র এক্সিকিউট-সম্পর্কিত ক্র্যাশে নিম্নলিখিত অ্যাবোর্ট বার্তাটি থাকে:

Cause: execute-only (no-read) memory access error; likely due to data in .text.

এই সমস্যাটি এড়ানোর জন্য এবং মেমরি ইন্সপেকশনের মতো অপারেশন সম্পাদন করতে, mprotect() কল করে execute-only সেগমেন্টগুলোকে read+execute হিসেবে চিহ্নিত করা সম্ভব। তবে, আমরা দৃঢ়ভাবে সুপারিশ করি যে এরপরে এটিকে আবার execute-only তে সেট করে দিন, কারণ এই অ্যাক্সেস পারমিশন সেটিংটি আপনার অ্যাপ এবং ব্যবহারকারীদের জন্য আরও ভালো সুরক্ষা প্রদান করে।

নিরাপত্তা

অ্যান্ড্রয়েড ১০-এ নিম্নলিখিত নিরাপত্তা পরিবর্তনগুলো অন্তর্ভুক্ত করা হয়েছে।

ডিফল্টরূপে TLS 1.3 সক্রিয় করা আছে

অ্যান্ড্রয়েড ১০ এবং এর পরবর্তী সংস্করণগুলোতে সকল TLS কানেকশনের জন্য TLS 1.3 ডিফল্টভাবে সক্রিয় থাকে। আমাদের TLS 1.3 ইমপ্লিমেন্টেশন সম্পর্কে কিছু গুরুত্বপূর্ণ তথ্য নিচে দেওয়া হলো:

  • TLS 1.3 সাইফার স্যুটগুলো কাস্টমাইজ করা যায় না। TLS 1.3 সক্রিয় করা হলে, সমর্থিত TLS 1.3 সাইফার স্যুটগুলোও সর্বদা সক্রিয় থাকে। setEnabledCipherSuites() কল করে এগুলো নিষ্ক্রিয় করার যেকোনো প্রচেষ্টা উপেক্ষা করা হয়।
  • TLS 1.3 নেগোসিয়েশনের সময়, সেশন ক্যাশে সেশন যুক্ত হওয়ার আগে HandshakeCompletedListener অবজেক্টগুলো কল করা হয়। (TLS 1.2 এবং অন্যান্য পূর্ববর্তী সংস্করণগুলোতে, সেশন ক্যাশে সেশন যুক্ত হওয়ার পরে এই অবজেক্টগুলো কল করা হয়।)
  • কিছু ক্ষেত্রে, অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলিতে SSLEngine ইনস্ট্যান্সগুলি SSLHandshakeException থ্রো করলেও, অ্যান্ড্রয়েড ১০ এবং তার পরবর্তী সংস্করণগুলিতে এই ইনস্ট্যান্সগুলি তার পরিবর্তে SSLProtocolException থ্রো করে।
  • 0-RTT মোড সমর্থিত নয়।

চাইলে, আপনি SSLContext.getInstance("TLSv1.2") কল করে TLS 1.3 নিষ্ক্রিয় করা একটি SSLContext পেতে পারেন। এছাড়াও, আপনি একটি উপযুক্ত অবজেক্টে setEnabledProtocols() কল করে প্রতিটি সংযোগের জন্য আলাদাভাবে প্রোটোকল সংস্করণ সক্রিয় বা নিষ্ক্রিয় করতে পারেন।

SHA-1 দিয়ে স্বাক্ষরিত সার্টিফিকেটগুলো TLS-এ বিশ্বস্ত নয়।

অ্যান্ড্রয়েড ১০-এ, SHA-1 হ্যাশ অ্যালগরিদম ব্যবহার করা সার্টিফিকেটগুলো TLS কানেকশনে বিশ্বস্ত বলে বিবেচিত হয় না। রুট CA-গুলো ২০১৬ সাল থেকে এই ধরনের সার্টিফিকেট ইস্যু করেনি এবং ক্রোম বা অন্যান্য প্রধান ব্রাউজারগুলোতেও এগুলো আর বিশ্বস্ত নয়।

যে সাইটটি SHA-1 ব্যবহার করে সার্টিফিকেট উপস্থাপন করে, তার সাথে সংযোগের যেকোনো প্রচেষ্টা ব্যর্থ হয়।

KeyChine-এর আচরণগত পরিবর্তন এবং উন্নতি

কিছু ব্রাউজার, যেমন গুগল ক্রোম, টিএলএস হ্যান্ডশেকের অংশ হিসেবে যখন একটি টিএলএস সার্ভার সার্টিফিকেট অনুরোধ বার্তা পাঠায়, তখন ব্যবহারকারীদের একটি সার্টিফিকেট বেছে নেওয়ার সুযোগ দেয়। অ্যান্ড্রয়েড ১০ থেকে, KeyChain KeyChain.choosePrivateKeyAlias() অবজেক্টগুলো ব্যবহারকারীদের সার্টিফিকেট নির্বাচনের জন্য একটি প্রম্পট দেখানোর ক্ষেত্রে ইস্যুকারী এবং কী স্পেসিফিকেশন প্যারামিটারগুলো মেনে চলে। বিশেষত, এই প্রম্পটে এমন কোনো বিকল্প থাকে না যা সার্ভারের স্পেসিফিকেশন মেনে চলে না।

যদি ব্যবহারকারী-নির্বাচনযোগ্য কোনো সার্টিফিকেট উপলব্ধ না থাকে—যেমনটা হয় যখন কোনো সার্টিফিকেট সার্ভারের স্পেসিফিকেশনের সাথে মেলে না অথবা কোনো ডিভাইসে কোনো সার্টিফিকেট ইনস্টল করা থাকে না—তাহলে সার্টিফিকেট নির্বাচনের প্রম্পটটি মোটেও প্রদর্শিত হয় না।

এছাড়াও, অ্যান্ড্রয়েড ১০ বা তার উচ্চতর সংস্করণে একটি KeyChain অবজেক্টে কী বা সিএ সার্টিফিকেট ইম্পোর্ট করার জন্য ডিভাইসের স্ক্রিন লক থাকা আবশ্যক নয়।

অন্যান্য TLS এবং ক্রিপ্টোগ্রাফি পরিবর্তন

TLS এবং ক্রিপ্টোগ্রাফি লাইব্রেরিতে বেশ কিছু ছোটখাটো পরিবর্তন আনা হয়েছে, যা অ্যান্ড্রয়েড ১০ থেকে কার্যকর হবে:

  • AES/GCM/NoPadding এবং ChaCha20/Poly1305/NoPadding সাইফারগুলো getOutputSize() থেকে আরও নির্ভুল বাফার সাইজ প্রদান করে।
  • TLS 1.2 বা তার উচ্চতর সর্বোচ্চ প্রোটোকলের সাথে সংযোগের প্রচেষ্টায় TLS_FALLBACK_SCSV সাইফার স্যুটটি বাদ দেওয়া হয়। TLS সার্ভার বাস্তবায়নে উন্নতির কারণে, আমরা TLS-বহির্ভূত ফলব্যাকের চেষ্টা করার পরামর্শ দিই না। এর পরিবর্তে, আমরা TLS সংস্করণ আলোচনার উপর নির্ভর করার পরামর্শ দিই।
  • ChaCha20-Poly1305 হলো ChaCha20/Poly1305/NoPadding-এর একটি বিকল্প নাম।
  • যেসব হোস্টনেমের শেষে ডট থাকে, সেগুলোকে বৈধ SNI হোস্টনেম হিসেবে গণ্য করা হয় না।
  • সার্টিফিকেট রেসপন্সের জন্য সাইনিং কী নির্বাচন করার সময় CertificateRequest এর supported_signature_algorithms এক্সটেনশনটি কার্যকর থাকে।
  • অ্যান্ড্রয়েড কীস্টোরের মতো অস্বচ্ছ সাইনিং কীগুলো TLS-এ RSA-PSS সিগনেচারের সাথে ব্যবহার করা যেতে পারে।

ওয়াই-ফাই ডাইরেক্ট সম্প্রচার

অ্যান্ড্রয়েড ১০-এ, ওয়াই-ফাই ডিরেক্ট সম্পর্কিত নিম্নলিখিত ব্রডকাস্টগুলো স্টিকি নয়:

যদি আপনার অ্যাপটি স্টিকি হওয়ার কারণে রেজিস্ট্রেশনের সময় এই ব্রডকাস্টগুলো পাওয়ার ওপর নির্ভর করে থাকে, তাহলে এর পরিবর্তে তথ্যটি পাওয়ার জন্য ইনিশিয়ালাইজেশনের সময় উপযুক্ত get() মেথডটি ব্যবহার করুন।

ওয়াই-ফাই সচেতন ক্ষমতা

অ্যান্ড্রয়েড ১০ ওয়াই-ফাই অ্যাওয়্যার ডেটাপাথ ব্যবহার করে টিসিপি/ইউডিপি সকেট তৈরি করা সহজ করার জন্য সাপোর্ট যোগ করেছে। একটি ServerSocket সাথে সংযোগকারী টিসিপি/ইউডিপি সকেট তৈরি করতে, ক্লায়েন্ট ডিভাইসটিকে সার্ভারের IPv6 অ্যাড্রেস এবং পোর্ট জানতে হয়। পূর্বে এই তথ্য আউট-অফ-ব্যান্ডে, যেমন বিটি বা ওয়াই-ফাই অ্যাওয়্যার লেয়ার ২ মেসেজিং ব্যবহার করে, অথবা ইন-ব্যান্ডে mDNS-এর মতো অন্যান্য প্রোটোকল ব্যবহার করে খুঁজে বের করতে হতো। অ্যান্ড্রয়েড ১০-এর মাধ্যমে, এই তথ্য নেটওয়ার্ক সেটআপের অংশ হিসেবেই জানানো যাবে।

সার্ভারটি নিম্নলিখিত কাজগুলোর যেকোনো একটি করতে পারে:

  • একটি ServerSocket চালু করুন এবং ব্যবহৃতব্য পোর্টটি সেট বা সংগ্রহ করুন।
  • Wi-Fi Aware নেটওয়ার্ক অনুরোধের অংশ হিসেবে পোর্ট সম্পর্কিত তথ্য উল্লেখ করুন।

নিম্নলিখিত কোড নমুনাটি দেখায় কিভাবে নেটওয়ার্ক অনুরোধের অংশ হিসেবে পোর্ট তথ্য নির্দিষ্ট করতে হয়:

কোটলিন

val ss = ServerSocket()
val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
  .setPskPassphrase("some-password")
  .setPort(ss.localPort)
  .build()

val myNetworkRequest = NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
  .setNetworkSpecifier(ns)
  .build()

জাভা

ServerSocket ss = new ServerSocket();
WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier
  .Builder(discoverySession, peerHandle)
  .setPskPassphrase(some-password)
  .setPort(ss.getLocalPort())
  .build();

NetworkRequest myNetworkRequest = new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
  .setNetworkSpecifier(ns)
  .build();

এরপর ক্লায়েন্ট সার্ভার কর্তৃক সরবরাহকৃত IPv6 এবং পোর্টটি পাওয়ার জন্য একটি Wi-Fi Aware নেটওয়ার্ক অনুরোধ সম্পাদন করে:

কোটলিন

val callback = object : ConnectivityManager.NetworkCallback() {
  override fun onAvailable(network: Network) {
    ...
  }
  
  override fun onLinkPropertiesChanged(network: Network,
      linkProperties: LinkProperties) {
    ...
  }

  override fun onCapabilitiesChanged(network: Network,
      networkCapabilities: NetworkCapabilities) {
    ...
    val ti = networkCapabilities.transportInfo
    if (ti is WifiAwareNetworkInfo) {
       val peerAddress = ti.peerIpv6Addr
       val peerPort = ti.port
    }
  }
  override fun onLost(network: Network) {
    ...
  }
};

connMgr.requestNetwork(networkRequest, callback)

জাভা

callback = new ConnectivityManager.NetworkCallback() {
  @Override
  public void onAvailable(Network network) {
    ...
  }
  @Override
  public void onLinkPropertiesChanged(Network network,
      LinkProperties linkProperties) {
    ...
  }
  @Override
  public void onCapabilitiesChanged(Network network,
      NetworkCapabilities networkCapabilities) {
    ...
    TransportInfo ti = networkCapabilities.getTransportInfo();
    if (ti instanceof WifiAwareNetworkInfo) {
       WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti;
       Inet6Address peerAddress = info.getPeerIpv6Addr();
       int peerPort = info.getPort();
    }
  }
  @Override
  public void onLost(Network network) {
    ...
  }
};

connMgr.requestNetwork(networkRequest, callback);

Go ডিভাইসগুলিতে SYSTEM_ALERT_WINDOW

অ্যান্ড্রয়েড ১০ (গো এডিশন) ডিভাইসে চালিত অ্যাপগুলো SYSTEM_ALERT_WINDOW পারমিশনটি পেতে পারে না। এর কারণ হলো, ওভারলে উইন্ডো আঁকতে অতিরিক্ত মেমরি ব্যবহৃত হয়, যা কম মেমরির অ্যান্ড্রয়েড ডিভাইসগুলোর পারফরম্যান্সের জন্য বিশেষভাবে ক্ষতিকর।

যদি অ্যান্ড্রয়েড ৯ বা তার নিম্নতর সংস্করণে চালিত কোনো গো এডিশন ডিভাইসে চলমান কোনো অ্যাপ SYSTEM_ALERT_WINDOW পারমিশনটি পায়, তবে ডিভাইসটি অ্যান্ড্রয়েড ১০-এ আপগ্রেড করা হলেও অ্যাপটি সেই পারমিশনটি ধরে রাখে। তবে, যেসব অ্যাপের কাছে আগে থেকেই সেই পারমিশনটি নেই, ডিভাইসটি আপগ্রেড করার পর তাদেরকে আর সেটি দেওয়া যাবে না।

যদি কোনো Go ডিভাইসের কোনো অ্যাপ ACTION_MANAGE_OVERLAY_PERMISSION অ্যাকশন সহ একটি ইন্টেন্ট পাঠায়, তাহলে সিস্টেম স্বয়ংক্রিয়ভাবে অনুরোধটি প্রত্যাখ্যান করে এবং ব্যবহারকারীকে একটি সেটিংস স্ক্রিনে নিয়ে যায়, যেখানে বলা হয় যে এই পারমিশনটি অনুমোদিত নয় কারণ এটি ডিভাইসকে ধীর করে দেয়। যদি কোনো Go ডিভাইসের অ্যাপ Settings.canDrawOverlays() কল করে, তাহলে মেথডটি সর্বদা false রিটার্ন করে। আবার, এই সীমাবদ্ধতাগুলো সেইসব অ্যাপের ক্ষেত্রে প্রযোজ্য নয়, যেগুলো ডিভাইসটি Android 10-এ আপগ্রেড করার আগে SYSTEM_ALERT_WINDOW পারমিশন পেয়েছিল।

পুরোনো অ্যান্ড্রয়েড সংস্করণ লক্ষ্য করে তৈরি অ্যাপগুলির জন্য সতর্কতা।

অ্যান্ড্রয়েড ১০ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলো অ্যান্ড্রয়েড ৫.১ (এপিআই লেভেল ২২) বা তার নিম্নতর সংস্করণকে লক্ষ্য করে তৈরি কোনো অ্যাপ প্রথমবার চালানোর সময় ব্যবহারকারীদের সতর্ক করে। যদি অ্যাপটির জন্য ব্যবহারকারীর অনুমতির প্রয়োজন হয়, তবে প্রথমবার অ্যাপটি চালানোর অনুমতি দেওয়ার আগে ব্যবহারকারীকে এর অনুমতিগুলো সমন্বয় করার সুযোগও দেওয়া হয়।

গুগল প্লে-এর টার্গেট এপিআই শর্তাবলীর কারণে, একজন ব্যবহারকারী এই সতর্কবার্তাগুলো কেবল তখনই দেখতে পান যখন তিনি এমন কোনো অ্যাপ চালান যা সম্প্রতি আপডেট করা হয়নি। অন্যান্য স্টোরের মাধ্যমে বিতরণ করা অ্যাপগুলোর জন্য, ২০১৯ সাল থেকে অনুরূপ টার্গেট এপিআই শর্তাবলী কার্যকর হচ্ছে। এই শর্তাবলী সম্পর্কে আরও তথ্যের জন্য, ‘২০১৯ সালে টার্গেট এপিআই স্তরের শর্তাবলীর সম্প্রসারণ’ দেখুন।

SHA-2 CBC সাইফার স্যুটগুলি সরানো হয়েছে

প্ল্যাটফর্ম থেকে নিম্নলিখিত SHA-2 CBC সাইফার স্যুটগুলো সরিয়ে ফেলা হয়েছে:

  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

এই সাইফার স্যুটগুলো GCM ব্যবহারকারী অনুরূপ সাইফার স্যুটগুলোর চেয়ে কম সুরক্ষিত, এবং বেশিরভাগ সার্ভার হয় এই সাইফার স্যুটগুলোর GCM ও CBC উভয় সংস্করণই সমর্থন করে, অথবা কোনোটিই সমর্থন করে না।

অ্যাপ ব্যবহার

অ্যান্ড্রয়েড ১০ অ্যাপ ব্যবহারের ক্ষেত্রে নিম্নলিখিত আচরণগত পরিবর্তনগুলো এনেছে:

  • UsageStats অ্যাপ ব্যবহারের উন্নতি - অ্যাপগুলো স্প্লিট-স্ক্রিন বা পিকচার-ইন-পিকচার মোডে ব্যবহার করা হলে Android 10, UsageStats- এর মাধ্যমে অ্যাপের ব্যবহার নির্ভুলভাবে ট্র্যাক করে। এছাড়াও, Android 10 তাৎক্ষণিক অ্যাপ ব্যবহারও সঠিকভাবে ট্র্যাক করে।

  • অ্যাপ-ভিত্তিক গ্রেস্কেল - অ্যান্ড্রয়েড ১০ প্রতিটি অ্যাপের জন্য আলাদাভাবে গ্রেস্কেল ডিসপ্লে মোড সেট করতে পারে।

  • অ্যাপ-ভিত্তিক মনোযোগ-বিচ্যুতির অবস্থা - অ্যান্ড্রয়েড ১০ বেছে বেছে অ্যাপগুলোকে একটি "মনোযোগ-বিচ্যুতির অবস্থা"-য় সেট করতে পারে, যেখানে সেগুলোর নোটিফিকেশন দমন করা হয় এবং সেগুলো সাজেস্টেড অ্যাপ হিসেবে প্রদর্শিত হয় না।

  • সাসপেনশন ও প্লেব্যাক - অ্যান্ড্রয়েড ১০-এ, সাসপেন্ড করা অ্যাপগুলো অডিও প্লে করতে পারে না।

HTTPS সংযোগ পরিবর্তন

যদি অ্যান্ড্রয়েড ১০ চালিত কোনো অ্যাপ setSSLSocketFactory() ফাংশনে null পাস করে, তাহলে একটি IllegalArgumentException ঘটে। পূর্ববর্তী সংস্করণগুলিতে, setSSLSocketFactory() ফাংশনে null পাস করার প্রভাব বর্তমান ডিফল্ট ফ্যাক্টরি পাস করার মতোই ছিল।

android.preference লাইব্রেরিটি অপ্রচলিত।

অ্যান্ড্রয়েড ১০ থেকে android.preference লাইব্রেরিটি অপ্রচলিত হয়ে গেছে। এর পরিবর্তে ডেভেলপারদের অ্যান্ড্রয়েড জেটপ্যাক- এর অংশ AndroidX প্রেফারেন্স লাইব্রেরি ব্যবহার করা উচিত। মাইগ্রেশন এবং ডেভেলপমেন্টে সহায়তার জন্য অতিরিক্ত রিসোর্সের জন্য, আমাদের পাবলিক স্যাম্পল অ্যাপ এবং রেফারেন্স ডকুমেন্টেশনের সাথে আপডেট করা সেটিংস গাইডটি দেখুন।

ZIP ফাইল ইউটিলিটি লাইব্রেরির পরিবর্তন

অ্যান্ড্রয়েড ১০, ZIP ফাইল পরিচালনাকারী java.util.zip প্যাকেজের ক্লাসগুলিতে নিম্নলিখিত পরিবর্তনগুলি এনেছে। এই পরিবর্তনগুলি অ্যান্ড্রয়েড এবং java.util.zip ব্যবহারকারী অন্যান্য প্ল্যাটফর্মগুলির মধ্যে লাইব্রেরিটির আচরণকে আরও সামঞ্জস্যপূর্ণ করে তোলে।

ইনফ্লেটার

পূর্ববর্তী সংস্করণগুলিতে, Inflater ক্লাসের কিছু মেথড end() কল করার পরে কল করা হলে IllegalStateException থ্রো করত। Android 10-এ, এই মেথডগুলি এর পরিবর্তে NullPointerException থ্রো করে।

জিপফাইল

অ্যান্ড্রয়েড ১০ এবং এর পরবর্তী সংস্করণগুলোতে, ZipFile এর যে কনস্ট্রাক্টরটি File , int , এবং Charset টাইপের আর্গুমেন্ট গ্রহণ করে, সেটি প্রদত্ত ZIP ফাইলে কোনো ফাইল না থাকলেও ZipException থ্রো করে না।

জিপআউটপুটস্ট্রিম

অ্যান্ড্রয়েড ১০ এবং এর পরবর্তী সংস্করণগুলোতে, ZipOutputStream এর finish() মেথডটি ZipException থ্রো করে না, যদি এটি এমন কোনো ZIP ফাইলের জন্য আউটপুট স্ট্রিম লেখার চেষ্টা করে যেটিতে কোনো ফাইল নেই।

ক্যামেরার পরিবর্তন

ক্যামেরা ব্যবহারকারী অনেক অ্যাপই ধরে নেয় যে, ডিভাইসটি যদি পোর্ট্রেট কনফিগারেশনে থাকে, তাহলে ডিভাইসটির বাহ্যিক রূপটিও পোর্ট্রেট ওরিয়েন্টেশনে থাকবে, যেমনটি ‘ক্যামেরা ওরিয়েন্টেশন’ অংশে বর্ণনা করা হয়েছে। অতীতে এই ধারণাটি নিরাপদ ছিল, কিন্তু ফোল্ডেবলের মতো বিভিন্ন আকারের ডিভাইসের সহজলভ্যতার কারণে সেই পরিস্থিতি বদলে গেছে। এই ডিভাইসগুলোতে এই ধরনের ধারণার ফলে ক্যামেরা ভিউফাইন্ডারটি ভুলভাবে ঘোরানো বা স্কেল করা (কিংবা উভয়ই) অবস্থায় প্রদর্শিত হতে পারে।

যেসব অ্যাপ্লিকেশন এপিআই লেভেল ২৪ বা তার উপরের সংস্করণকে টার্গেট করে, তাদের স্পষ্টভাবে android:resizeableActivity সেট করতে হবে এবং একাধিক উইন্ডো পরিচালনার জন্য প্রয়োজনীয় কার্যকারিতা প্রদান করতে হবে।

ব্যাটারি ব্যবহারের ট্র্যাকিং

অ্যান্ড্রয়েড ১০ থেকে শুরু করে, কোনো বড় ধরনের চার্জিং ইভেন্টের পর ডিভাইসটি আনপ্লাগ করা হলে SystemHealthManager তার ব্যাটারি ব্যবহারের পরিসংখ্যান রিসেট করে দেয়। সাধারণভাবে বলতে গেলে, একটি বড় ধরনের চার্জিং ইভেন্ট হলো: ডিভাইসটি সম্পূর্ণ চার্জ হয়ে যাওয়া, অথবা ডিভাইসটি প্রায় চার্জশূন্য অবস্থা থেকে প্রায় চার্জিত অবস্থায় চলে আসা।

অ্যান্ড্রয়েড ১০ আসার আগে, ব্যাটারির লেভেলে যতই সামান্য পরিবর্তন হোক না কেন, ডিভাইসটি আনপ্লাগ করা হলেই ব্যাটারি ব্যবহারের পরিসংখ্যান রিসেট হয়ে যেত।

অ্যান্ড্রয়েড বিম অবচয়

অ্যান্ড্রয়েড ১০-এ আমরা আনুষ্ঠানিকভাবে অ্যান্ড্রয়েড বিম (Android Beam) ফিচারটি বাতিল করছি, যা নিয়ার ফিল্ড কমিউনিকেশন (NFC)-এর মাধ্যমে বিভিন্ন ডিভাইসের মধ্যে ডেটা আদান-প্রদানের একটি পুরোনো ফিচার। আমরা এর সাথে সম্পর্কিত বেশ কয়েকটি এনএফসি এপিআই-ও বাতিল করছি। যেসব ডিভাইস-নির্মাতা পার্টনাররা এটি ব্যবহার করতে চান, তাদের জন্য অ্যান্ড্রয়েড বিম ঐচ্ছিকভাবে উপলব্ধ থাকবে, কিন্তু এর সক্রিয় উন্নয়ন আর হচ্ছে না। তবে, অ্যান্ড্রয়েড অন্যান্য এনএফসি সক্ষমতা এবং এপিআই সমর্থন করা চালিয়ে যাবে এবং ট্যাগ থেকে ডেটা পড়া ও পেমেন্টের মতো ব্যবহারিক ক্ষেত্রগুলো প্রত্যাশিতভাবেই কাজ করতে থাকবে।

java.math.BigDecimal.stripTrailingZeros() এর আচরণ পরিবর্তন

ইনপুট মান শূন্য হলে BigDecimal.stripTrailingZeros() আর বিশেষ ক্ষেত্র হিসেবে শেষের শূন্যগুলো সংরক্ষণ করে না।

java.util.regex.Matcher এবং Pattern-এর আচরণের পরিবর্তন

split() ফাংশনের ফলাফলে এখন থেকে ইনপুটের শুরুতে জিরো-উইডথ ম্যাচ থাকলে তা আর একটি খালি String ("") দিয়ে শুরু হবে না। এই পরিবর্তনটি String.split() ফাংশনকেও প্রভাবিত করে। উদাহরণস্বরূপ, "x".split("") এখন {"x"} রিটার্ন করে, যেখানে অ্যান্ড্রয়েডের পুরোনো সংস্করণগুলিতে এটি {"", "x"} রিটার্ন করত। "aardvark".split("(?=a)" এখন {"a", "ardv", "ark"} এর পরিবর্তে {"", "a", "ardv", "ark"}

অবৈধ আর্গুমেন্টের ক্ষেত্রে ব্যতিক্রমী আচরণও উন্নত করা হয়েছে:

  • appendReplacement(StringBuffer, String) এখন IndexOutOfBoundsException এর পরিবর্তে IllegalArgumentException থ্রো করে, যদি রিপ্লেসমেন্ট String একটি একক ব্যাকস্ল্যাশ দিয়ে শেষ হয়, যা অবৈধ। রিপ্লেসমেন্ট String $ চিহ্ন দিয়ে শেষ হলেও এখন একই এক্সেপশন থ্রো করা হয়। পূর্বে এই পরিস্থিতিতে কোনো এক্সেপশন থ্রো করা হতো না।
  • যদি Matcher একটি NullPointerException থ্রো করে, তাহলে replaceFirst(null) এখন আর Matcher এর উপর reset() কল করে না। এখন কোনো ম্যাচ না থাকলেও NullPointerException থ্রো করা হয়। আগে, এটি শুধুমাত্র ম্যাচ থাকলেই থ্রো করা হতো।
  • start(int group) , end(int group) এবং group(int group) এখন গ্রুপ ইন্ডেক্স সীমার বাইরে গেলে একটি আরও সাধারণ IndexOutOfBoundsException থ্রো করে। পূর্বে এই মেথডগুলো ArrayIndexOutOfBoundsException থ্রো করত।

GradientDrawable-এর ডিফল্ট অ্যাঙ্গেল এখন TOP_BOTTOM

অ্যান্ড্রয়েড ১০-এ, আপনি যদি XML-এ একটি GradientDrawable নির্ধারণ করেন এবং কোনো কোণের পরিমাপ প্রদান না করেন, তাহলে গ্রেডিয়েন্টের অভিমুখ ডিফল্টভাবে TOP_BOTTOM হয়ে যায়। এটি অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলো থেকে একটি পরিবর্তন, যেখানে ডিফল্ট ছিল LEFT_RIGHT

একটি বিকল্প সমাধান হিসেবে, আপনি যদি AAPT2- এর সর্বশেষ সংস্করণে আপডেট করেন, তাহলে কোনো কোণের পরিমাপ নির্দিষ্ট করা না থাকলে টুলটি লিগ্যাসি অ্যাপগুলির জন্য কোণের পরিমাপ ০ নির্ধারণ করে।

ডিফল্ট SUID ব্যবহার করে সিরিয়ালাইজড অবজেক্টের জন্য লগিং

অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) থেকে শুরু করে, প্ল্যাটফর্মটি সিরিয়ালাইজেবল অবজেক্টগুলোর ডিফল্ট serialVersionUID তে একটি সংশোধন এনেছে। এই সংশোধনটি সেইসব অ্যাপকে প্রভাবিত করেনি যেগুলো এপিআই লেভেল ২৩ বা তার নিচের সংস্করণকে টার্গেট করেছিল।

অ্যান্ড্রয়েড ১০ থেকে শুরু করে, যদি কোনো অ্যাপ এপিআই লেভেল ২৩ বা তার নিচের সংস্করণকে টার্গেট করে এবং পুরোনো, ভুল, ডিফল্ট serialVersionUID উপর নির্ভর করে, তাহলে সিস্টেম একটি সতর্কবার্তা লগ করে এবং কোড সংশোধনের পরামর্শ দেয়।

বিশেষত, নিম্নলিখিত সবগুলি সত্য হলে সিস্টেমটি একটি সতর্কবার্তা লগ করে:

  • অ্যাপটি এপিআই লেভেল ২৩ বা তার নিচের সংস্করণকে লক্ষ্য করে তৈরি।
  • একটি ক্লাসকে সিরিয়ালাইজ করা হয়।
  • সিরিয়ালাইজড ক্লাসটি স্পষ্টভাবে serialVersionUID সেট করার পরিবর্তে ডিফল্ট serialVersionUID ব্যবহার করে।
  • অ্যাপটি যদি এপিআই লেভেল ২৪ বা তার বেশি টার্গেট করত, তাহলে যে serialVersionUID হতো, ডিফল্ট serialVersionUID তার থেকে ভিন্ন।

এই সতর্কবার্তাটি প্রতিটি প্রভাবিত ক্লাসের জন্য একবার লগ করা হয়। সতর্কবার্তাটিতে একটি প্রস্তাবিত সমাধান অন্তর্ভুক্ত রয়েছে, যা হলো serialVersionUID কে স্পষ্টভাবে সেই ডিফল্ট মানে সেট করা, যা অ্যাপটি এপিআই লেভেল ২৪ বা তার বেশি টার্গেট করলে গণনা করা হতো। এই সমাধানটি ব্যবহার করে, আপনি নিশ্চিত করতে পারেন যে যদি সেই ক্লাসের কোনো অবজেক্ট এপিআই লেভেল ২৩ বা তার কম টার্গেট করা কোনো অ্যাপে সিরিয়ালাইজ করা হয়, তবে ২৪ বা তার বেশি টার্গেট করা অ্যাপগুলো অবজেক্টটি সঠিকভাবে পড়তে পারবে এবং এর বিপরীতটিও ঘটবে।

java.io.FileChannel.map() পরিবর্তন

অ্যান্ড্রয়েড ১০ থেকে, /dev/zero এর মতো নন-স্ট্যান্ডার্ড ফাইলগুলির জন্য FileChannel.map() সমর্থিত নয়, যেগুলির আকার truncate() ব্যবহার করে পরিবর্তন করা যায় না। অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলি truncate() দ্বারা ফেরত আসা errno উপেক্ষা করত, কিন্তু অ্যান্ড্রয়েড ১০ একটি IOException থ্রো করে। আপনার যদি পুরানো আচরণটির প্রয়োজন হয়, তবে আপনাকে অবশ্যই নেটিভ কোড ব্যবহার করতে হবে।