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

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

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

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

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

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

নন-SDK ইন্টারফেস সীমাবদ্ধতা

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

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

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

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

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

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

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

এনডিকে

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

শেয়ার করা বস্তুগুলিতে টেক্সট স্থানান্তর থাকতে পারে না

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

SELinux এই বিধিনিষেধ আরোপ করে এমন অ্যাপগুলিতে যা Android 10 বা তার পরবর্তী ভার্সনকে লক্ষ্য করে। যদি এই অ্যাপগুলি শেয়ার করা বস্তু ব্যবহার করতে থাকে যাতে টেক্সট স্থানান্তর থাকে, তাহলে সেগুলি ভেঙে যাওয়ার ঝুঁকিতে থাকে।

বায়োনিক লাইব্রেরি এবং গতিশীল লিঙ্কার পাথের পরিবর্তন

অ্যান্ড্রয়েড ১০ থেকে শুরু করে, বেশ কয়েকটি পাথ নিয়মিত ফাইলের পরিবর্তে প্রতীকী লিঙ্ক। যেসব অ্যাপ নিয়মিত ফাইলের পাথের উপর নির্ভর করে আসছে, সেগুলো ভেঙে যেতে পারে:

  • /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

এই পরিবর্তনগুলি ফাইলের 64-বিট ভেরিয়েন্টের ক্ষেত্রেও প্রযোজ্য, lib/ এর পরিবর্তে lib64/ ব্যবহার করা হয়েছে।

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

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

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

/data/tombstones/ তে সম্পর্কিত tombstone ফাইল পরীক্ষা করে আপনি এই আচরণটি ক্র্যাশের কারণ কিনা তা সনাক্ত করতে পারেন। একটি execute-only সম্পর্কিত ক্র্যাশে নিম্নলিখিত abort বার্তা থাকে:

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 ইনস্ট্যান্সগুলি Android এর পূর্ববর্তী সংস্করণগুলিতে একটি SSLHandshakeException ফেলে দেয়, এই ইনস্ট্যান্সগুলি Android 10 এবং উচ্চতর সংস্করণগুলিতে পরিবর্তে একটি SSLProtocolException ফেলে দেয়।
  • ০-RTT মোড সমর্থিত নয়।

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

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

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

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

কীচেইন আচরণের পরিবর্তন এবং উন্নতি

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

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

এছাড়াও, Android 10 বা তার পরবর্তী ভার্সনে KeyChain অবজেক্টে কী বা CA সার্টিফিকেট আমদানি করার জন্য ডিভাইসের স্ক্রিন লক থাকা আবশ্যক নয়।

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

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

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

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

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

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

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

Wi-Fi Aware ডেটাপাথ ব্যবহার করে TCP/UDP সকেট তৈরি সহজ করার জন্য Android 10 সমর্থন যোগ করে। ServerSocket এর সাথে সংযুক্ত একটি TCP/UDP সকেট তৈরি করতে, ক্লায়েন্ট ডিভাইসটিকে সার্ভারের IPv6 ঠিকানা এবং পোর্ট জানতে হবে। এটি আগে ব্যান্ডের বাইরে যোগাযোগ করা হত, যেমন BT বা Wi-Fi Aware লেয়ার 2 মেসেজিং ব্যবহার করে, অথবা mDNS এর মতো অন্যান্য প্রোটোকল ব্যবহার করে ইন-ব্যান্ড আবিষ্কার করা হত। Android 10 এর মাধ্যমে, নেটওয়ার্ক সেটআপের অংশ হিসাবে তথ্য যোগাযোগ করা যেতে পারে।

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

  • একটি 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);

SYSTEM_ALERT_WINDOW অন গো ডিভাইস

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

যদি Android 9 বা তার নিচের ভার্সনে চলমান Go সংস্করণের ডিভাইসে চলমান কোনও অ্যাপ SYSTEM_ALERT_WINDOW অনুমতি পায়, তাহলে ডিভাইসটি Android 10 এ আপগ্রেড করা হলেও অ্যাপটি অনুমতিটি ধরে রাখে। তবে, যেসব অ্যাপের ইতিমধ্যেই সেই অনুমতি নেই, তাদের ডিভাইস আপগ্রেড করার পরে এটি দেওয়া যাবে না।

যদি 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 সংযোগ পরিবর্তন

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

android.preference লাইব্রেরিটি বন্ধ করা হয়েছে

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

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

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

ইনফ্লেটার

পূর্ববর্তী সংস্করণগুলিতে, Inflater ক্লাসের কিছু পদ্ধতিতে যদি end() কল করার পরে Invok করা হয় তবে IllegalStateException ব্যবহার করা হত। Android 10-এ, এই পদ্ধতিগুলিতে NullPointerException ব্যবহার করা হত।

জিপফাইল

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

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

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

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

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

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

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

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

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

অ্যান্ড্রয়েড বিম বন্ধ করা হচ্ছে

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

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

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

java.util.regex.Matcher এবং প্যাটার্ন আচরণের পরিবর্তন

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

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

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

GradientDrawable এর ডিফল্ট কোণ এখন TOP_BOTTOM

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

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

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

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

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

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

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

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

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

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