পূর্ববর্তী রিলিজগুলোর মতোই, অ্যান্ড্রয়েড ১৬-এ এমন কিছু আচরণগত পরিবর্তন রয়েছে যা আপনার অ্যাপকে প্রভাবিত করতে পারে। নিম্নলিখিত আচরণগত পরিবর্তনগুলো শুধুমাত্র সেইসব অ্যাপের জন্য প্রযোজ্য যেগুলো অ্যান্ড্রয়েড ১৬ বা তার উচ্চতর সংস্করণকে টার্গেট করছে। যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ১৬ বা তার উচ্চতর সংস্করণকে টার্গেট করে থাকে, তবে প্রযোজ্য ক্ষেত্রে এই আচরণগুলো সমর্থন করার জন্য আপনার অ্যাপটি পরিবর্তন করা উচিত।
আপনার অ্যাপের targetSdkVersion নির্বিশেষে Android 16-এ চালিত সমস্ত অ্যাপকে প্রভাবিত করে এমন আচরণগত পরিবর্তনের তালিকাটিও পর্যালোচনা করতে ভুলবেন না।
ব্যবহারকারীর অভিজ্ঞতা এবং সিস্টেম UI
অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬)-এ নিম্নলিখিত পরিবর্তনগুলো অন্তর্ভুক্ত করা হয়েছে, যার উদ্দেশ্য হলো আরও সামঞ্জস্যপূর্ণ ও স্বজ্ঞামূলক ব্যবহারকারীর অভিজ্ঞতা তৈরি করা।
এজ-টু-এজ অপ্ট-আউট বন্ধ হয়ে যাচ্ছে
Android 15 enforced edge-to-edge for apps targeting Android 15 (API
level 35), but your app could opt-out by setting
R.attr#windowOptOutEdgeToEdgeEnforcement to true. For apps
targeting Android 16 (API level 36),
R.attr#windowOptOutEdgeToEdgeEnforcement is deprecated and disabled, and your
app can't opt-out of going edge-to-edge.
- If your app targets Android 16 (API level 36) and is running on an
Android 15 device,
R.attr#windowOptOutEdgeToEdgeEnforcementcontinues to work. - If your app targets Android 16 (API level 36) and is running on an
Android 16 device,
R.attr#windowOptOutEdgeToEdgeEnforcementis disabled.
For testing in Android 16, ensure your app supports edge-to-edge and
remove any use of R.attr#windowOptOutEdgeToEdgeEnforcement so that your app
also supports edge-to-edge on an Android 15 device. To support edge-to-edge,
see the Compose and Views guidance.
ভবিষ্যদ্বাণীমূলক ব্যাকআপের জন্য মাইগ্রেশন বা অপ্ট-আউট প্রয়োজন।
For apps targeting Android 16 (API level 36) or higher and running on an
Android 16 or higher device, the predictive back system animations
(back-to-home, cross-task, and cross-activity) are enabled by default.
Additionally, onBackPressed is not called and
KeyEvent.KEYCODE_BACK is not dispatched anymore.
If your app intercepts the back event and you haven't migrated to predictive
back yet, update your app to use supported back navigation APIs, or
temporarily opt out by setting the
android:enableOnBackInvokedCallback attribute to false in the
<application> or <activity> tag of your app's AndroidManifest.xml file.
মার্জিত ফন্ট এপিআইগুলি অপ্রচলিত এবং নিষ্ক্রিয় করা হয়েছে।
以 Android 15(API 级别 35)为目标平台的应用默认将 elegantTextHeight
TextView 属性设置为 true,从而将紧凑型字体替换为可读性更高的字体。您可以通过将 elegantTextHeight 属性设置为 false 来替换此设置。
Android 16 弃用了 elegantTextHeight 属性,当您的应用以 Android 16 为目标平台后,系统会忽略该属性。由这些 API 控制的“界面字体”即将停用,因此您应调整所有布局,以确保阿拉伯语、老挝语、缅甸语、泰米尔语、古吉拉特语、卡纳达语、马拉雅拉姆语、奥里亚语、泰卢固语或泰语文本的呈现效果一致且不受未来变化的影响。
elegantTextHeight 属性设置为 false 替换默认值的应用,
elegantTextHeight 行为。elegantTextHeight 属性设置为 false 来替换默认值的应用,其 elegantTextHeight 行为。
মূল কার্যকারিতা
অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬)-এ নিম্নলিখিত পরিবর্তনগুলো অন্তর্ভুক্ত রয়েছে, যা অ্যান্ড্রয়েড সিস্টেমের বিভিন্ন মূল সক্ষমতাকে সংশোধন বা প্রসারিত করে।
স্থির হারে কাজের সময়সূচী অপ্টিমাইজেশন
Prior to targeting Android 16, when scheduleAtFixedRate
missed a task execution due to being outside a valid
process lifecycle, all missed executions immediately
execute when the app returns to a valid lifecycle.
When targeting Android 16, at most one missed execution of
scheduleAtFixedRate is immediately executed when the app
returns to a valid lifecycle. This behavior change is expected to improve app
performance. Test this behavior in your app to check if your app is impacted.
You can also test by using the app compatibility framework
and enabling the STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS compat flag.
ডিভাইসের ফর্ম ফ্যাক্টর
অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬)-এ বড় স্ক্রিনের ডিভাইসে অ্যাপ প্রদর্শনের ক্ষেত্রে নিম্নলিখিত পরিবর্তনগুলো অন্তর্ভুক্ত করা হয়েছে।
অভিযোজিত বিন্যাস
যেহেতু অ্যান্ড্রয়েড অ্যাপগুলো এখন বিভিন্ন ধরনের ডিভাইসে (যেমন ফোন, ট্যাবলেট, ফোল্ডেবল, ডেস্কটপ, গাড়ি এবং টিভি) চলে এবং বড় স্ক্রিনে উইন্ডোইং মোড (যেমন স্প্লিট স্ক্রিন ও ডেস্কটপ উইন্ডোইং) রয়েছে, তাই ডেভেলপারদের এমন অ্যান্ড্রয়েড অ্যাপ তৈরি করা উচিত যা ডিভাইসের ওরিয়েন্টেশন নির্বিশেষে যেকোনো স্ক্রিন এবং উইন্ডোর আকারের সাথে খাপ খাইয়ে নিতে পারে। আজকের এই মাল্টিডিভাইস বিশ্বে ওরিয়েন্টেশন এবং রিসাইজযোগ্যতা সীমাবদ্ধ করার মতো ধারণাগুলো খুবই সংকীর্ণ।
অভিমুখ, আকার পরিবর্তনযোগ্যতা এবং আকৃতি অনুপাতের সীমাবদ্ধতা উপেক্ষা করুন
অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬) টার্গেট করা অ্যাপগুলোর ক্ষেত্রে, সর্বনিম্ন প্রস্থ >= ৬০০ডিপি (dp) যুক্ত ডিসপ্লেতে ওরিয়েন্টেশন, রিসাইজযোগ্যতা এবং অ্যাসপেক্ট রেশিওর সীমাবদ্ধতা আর প্রযোজ্য হবে না। অ্যাপগুলো অ্যাসপেক্ট রেশিও বা ব্যবহারকারীর পছন্দের ওরিয়েন্টেশন নির্বিশেষে সম্পূর্ণ ডিসপ্লে উইন্ডো জুড়ে থাকবে এবং পিলরবক্সিং ব্যবহৃত হবে না।
এই পরিবর্তনটি একটি নতুন স্ট্যান্ডার্ড প্ল্যাটফর্ম আচরণ চালু করেছে। অ্যান্ড্রয়েড এমন একটি মডেলের দিকে এগোচ্ছে যেখানে অ্যাপগুলো বিভিন্ন ওরিয়েন্টেশন, ডিসপ্লে সাইজ এবং অ্যাস্পেক্ট রেশিওর সাথে নিজেদের মানিয়ে নেবে বলে আশা করা হয়। নির্দিষ্ট ওরিয়েন্টেশন বা সীমিত আকার পরিবর্তনের ক্ষমতার মতো সীমাবদ্ধতা অ্যাপের অভিযোজন ক্ষমতাকে বাধাগ্রস্ত করে। সর্বোত্তম ব্যবহারকারী অভিজ্ঞতা প্রদানের জন্য আপনার অ্যাপটিকে অভিযোজনযোগ্য করে তুলুন ।
আপনি অ্যাপ কম্প্যাটিবিলিটি ফ্রেমওয়ার্ক ব্যবহার করে এবং UNIVERSAL_RESIZABLE_BY_DEFAULT কম্প্যাট ফ্ল্যাগটি সক্রিয় করার মাধ্যমেও এই আচরণটি পরীক্ষা করতে পারেন।
সাধারণ ব্রেকিং পরিবর্তনগুলি
ওরিয়েন্টেশন, রিসাইজেবিলিটি এবং অ্যাসপেক্ট রেশিওর সীমাবদ্ধতা উপেক্ষা করলে কিছু ডিভাইসে আপনার অ্যাপের UI প্রভাবিত হতে পারে, বিশেষ করে সেইসব এলিমেন্টের ক্ষেত্রে যেগুলো পোর্ট্রেট ওরিয়েন্টেশনে আবদ্ধ ছোট লেআউটের জন্য ডিজাইন করা হয়েছিল: যেমন, স্ট্রেচড লেআউট এবং অফ-স্ক্রিন অ্যানিমেশন ও কম্পোনেন্টের মতো সমস্যা। অ্যাসপেক্ট রেশিও বা ওরিয়েন্টেশন সম্পর্কে যেকোনো অনুমান আপনার অ্যাপে ভিজ্যুয়াল সমস্যা তৈরি করতে পারে। এগুলো কীভাবে এড়ানো যায় এবং আপনার অ্যাপের অ্যাডাপ্টিভ আচরণ কীভাবে উন্নত করা যায় সে সম্পর্কে আরও জানুন ।
ডিভাইস ঘোরানোর অনুমতি দিলে অ্যাক্টিভিটি বারবার তৈরি হয়, যা সঠিকভাবে সংরক্ষণ করা না হলে ইউজার স্টেট হারিয়ে যাওয়ার কারণ হতে পারে। কীভাবে UI স্টেট সঠিকভাবে সংরক্ষণ করতে হয়, তা জানতে "Save UI states" অংশটি দেখুন।
বাস্তবায়নের বিবরণ
বড় স্ক্রিনের ডিভাইসগুলিতে ফুল-স্ক্রিন এবং মাল্টি-উইন্ডো মোডে নিম্নলিখিত ম্যানিফেস্ট অ্যাট্রিবিউট এবং রানটাইম এপিআইগুলি উপেক্ষা করা হয়:
-
screenOrientation -
resizableActivity -
minAspectRatio -
maxAspectRatio -
setRequestedOrientation() -
getRequestedOrientation()
screenOrientation , setRequestedOrientation() , এবং getRequestedOrientation() এর নিম্নলিখিত মানগুলি উপেক্ষা করা হয়:
-
portrait -
reversePortrait -
sensorPortrait -
userPortrait -
landscape -
reverseLandscape -
sensorLandscape -
userLandscape
ডিসপ্লে রিসাইজ করার ক্ষেত্রে, android:resizeableActivity="false" , android:minAspectRatio , এবং android:maxAspectRatio কোনো প্রভাব নেই।
অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬) টার্গেট করা অ্যাপগুলোর ক্ষেত্রে, বড় স্ক্রিনে ডিফল্টভাবে অ্যাপের ওরিয়েন্টেশন, রিসাইজযোগ্যতা এবং অ্যাসপেক্ট রেশিওর সীমাবদ্ধতাগুলো উপেক্ষা করা হয়। যে কোনো অ্যাপ যা এখনও পুরোপুরি প্রস্তুত নয়, তা অপ্ট-আউট করার মাধ্যমে সাময়িকভাবে এই আচরণটি ওভাররাইড করতে পারে, যার ফলে অ্যাপটি কম্প্যাটিবিলিটি মোডে চলে যাওয়ার পূর্ববর্তী আচরণে ফিরে আসে।
ব্যতিক্রম
অ্যান্ড্রয়েড ১৬-এর ওরিয়েন্টেশন, রিসাইজযোগ্যতা এবং অ্যাসপেক্ট রেশিও সংক্রান্ত সীমাবদ্ধতাগুলো নিম্নলিখিত পরিস্থিতিগুলোতে প্রযোজ্য নয়:
- গেমস (
android:appCategoryফ্ল্যাগের উপর ভিত্তি করে) - ডিভাইসের অ্যাস্পেক্ট রেশিও সেটিংসে ব্যবহারকারীরা অ্যাপটির ডিফল্ট আচরণ স্পষ্টভাবে বেছে নিলে
-
sw600dpএর চেয়ে ছোট স্ক্রিন
সাময়িকভাবে অপ্ট আউট করুন
কোনো নির্দিষ্ট কার্যকলাপ থেকে অপ্ট-আউট করতে, PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY ম্যানিফেস্ট প্রপার্টিটি ডিক্লেয়ার করুন:
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
আপনার অ্যাপের অনেক অংশ যদি অ্যান্ড্রয়েড ১৬-এর জন্য প্রস্তুত না থাকে, তাহলে অ্যাপ্লিকেশন লেভেলে একই প্রপার্টি প্রয়োগ করে আপনি সম্পূর্ণরূপে অপ্ট আউট করতে পারেন:
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
স্বাস্থ্য ও ফিটনেস
অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬)-এ স্বাস্থ্য ও ফিটনেস ডেটা সম্পর্কিত নিম্নলিখিত পরিবর্তনগুলো অন্তর্ভুক্ত করা হয়েছে।
স্বাস্থ্য ও ফিটনেস অনুমতি
对于以 Android 16(API 级别 36)或更高版本为目标平台的应用,
BODY_SENSORS 权限使用更精细的权限
under android.permissions.health,which Health Connect
also uses。从 Android 16 开始,凡是以前需要具有 BODY_SENSORS
或 BODY_SENSORS_BACKGROUND 权限的 API,现在都需要获取相应的
android.permissions.health 权限。这会影响以下数据类型、API 和前台服务类型:
HEART_RATE_BPMWear OS 上的健康服务Sensor.TYPE_HEART_RATE来自 Android Sensor ManagerheartRateAccuracy和heartRateBpm(来自 Wear OS 上的ProtoLayout)FOREGROUND_SERVICE_TYPE_HEALTH,其中需要使用相应的android.permission.health权限来代替BODY_SENSORS
如果您的应用使用这些 API,则应请求相应的精细权限:
- 如需在使用期间监测心率、血氧饱和度或体表温度:
请请求
android.permissions.health下的精细权限,例如READ_HEART_RATE,而不是BODY_SENSORS。 - 如需访问后台传感器,请请求
READ_HEALTH_DATA_IN_BACKGROUND,而不是BODY_SENSORS_BACKGROUND。
这些权限与保护对 Health Connect(用于存储健康、 健身和保健数据的 Android 数据存储区)中数据的读取访问权限的权限相同。
移动应用
迁移为使用 READ_HEART_RATE 和其他精细权限的移动应用还必须 声明一项 activity 以显示应用的隐私权政策。这与健康数据共享的要求相同。
সংযোগ
পেরিফেরাল ডিভাইসগুলোর সাথে সংযোগ উন্নত করার জন্য অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬)-এর ব্লুটুথ স্ট্যাকে নিম্নলিখিত পরিবর্তনগুলো অন্তর্ভুক্ত করা হয়েছে।
বন্ড ক্ষতি এবং এনক্রিপশন পরিবর্তনগুলি পরিচালনা করার জন্য নতুন উদ্দেশ্য
উন্নত বন্ড লস পরিচালনার অংশ হিসাবে, Android 16 বন্ড ক্ষয় এবং এনক্রিপশন পরিবর্তন সম্পর্কে আরও বেশি সচেতনতা সহ অ্যাপগুলি সরবরাহ করার জন্য 2টি নতুন উদ্দেশ্যও প্রবর্তন করেছে।
Android 16 টার্গেট করা অ্যাপগুলি এখন করতে পারে:
- একটি
ACTION_KEY_MISSINGঅভিপ্রায় প্রাপ্ত করুন যখন দূরবর্তী বন্ড ক্ষতি সনাক্ত করা হয়, তাদের আরও তথ্যপূর্ণ ব্যবহারকারীর প্রতিক্রিয়া প্রদান করতে এবং যথাযথ পদক্ষেপ নেওয়ার অনুমতি দেয়৷ - যখনই লিঙ্কের এনক্রিপশন স্থিতি পরিবর্তন হয় তখন একটি
ACTION_ENCRYPTION_CHANGEঅভিপ্রায় পান৷ এর মধ্যে রয়েছে এনক্রিপশন স্ট্যাটাস পরিবর্তন, এনক্রিপশন অ্যালগরিদম পরিবর্তন এবং এনক্রিপশন কী সাইজ পরিবর্তন। পরেACTION_ENCRYPTION_CHANGEঅভিপ্রায় পাওয়ার পরে যদি লিঙ্কটি সফলভাবে এনক্রিপ্ট করা হয় তবে অ্যাপগুলিকে অবশ্যই বন্ড পুনরুদ্ধার করা বিবেচনা করতে হবে৷
বিভিন্ন OEM বাস্তবায়নের সাথে মানিয়ে নেওয়া
অ্যান্ড্রয়েড 16 যখন এই নতুন অভিপ্রায়গুলি প্রবর্তন করে, তাদের বাস্তবায়ন এবং সম্প্রচার বিভিন্ন ডিভাইস নির্মাতাদের (OEMs) জুড়ে পরিবর্তিত হতে পারে। আপনার অ্যাপটি সমস্ত ডিভাইস জুড়ে একটি সামঞ্জস্যপূর্ণ এবং নির্ভরযোগ্য অভিজ্ঞতা প্রদান করে তা নিশ্চিত করতে, বিকাশকারীদের তাদের বন্ড লস হ্যান্ডলিং ডিজাইন করা উচিত যাতে এই সম্ভাব্য বৈচিত্রগুলির সাথে সুন্দরভাবে মানিয়ে নেওয়া যায়।
আমরা নিম্নলিখিত অ্যাপ আচরণের সুপারিশ করি:
যদি
ACTION_KEY_MISSINGঅভিপ্রায় সম্প্রচার করা হয়:ACL (অ্যাসিনক্রোনাস সংযোগ-কম) লিঙ্কটি সিস্টেম দ্বারা সংযোগ বিচ্ছিন্ন করা হবে, কিন্তু ডিভাইসের জন্য বন্ড তথ্য (যেমন এখানে বর্ণনা করা হয়েছে) ধরে রাখা হবে।
আপনার অ্যাপের এই অভিপ্রায়টি বন্ড ক্ষতি সনাক্তকরণের প্রাথমিক সংকেত হিসাবে ব্যবহার করা উচিত এবং ডিভাইসটি ভুলে যাওয়া বা পুনরায় জোড়া লাগানোর আগে রিমোট ডিভাইসটি পরিসীমার মধ্যে রয়েছে তা নিশ্চিত করতে ব্যবহারকারীকে গাইড করা উচিত।
ACTION_KEY_MISSINGপ্রাপ্তির পরে যদি একটি ডিভাইস সংযোগ বিচ্ছিন্ন হয়ে যায়, আপনার অ্যাপটিকে পুনরায় সংযোগ করার বিষয়ে সতর্ক হওয়া উচিত, কারণ ডিভাইসটি আর সিস্টেমের সাথে বন্ধন নাও থাকতে পারে৷যদি
ACTION_KEY_MISSINGঅভিপ্রায় সম্প্রচার না করা হয়:ACL লিঙ্কটি সংযুক্ত থাকবে এবং ডিভাইসের বন্ড তথ্য সিস্টেম দ্বারা সরিয়ে দেওয়া হবে, Android 15-এর আচরণের মতো।
এই পরিস্থিতিতে, বন্ড লস ইভেন্টগুলি সনাক্ত করতে এবং পরিচালনা করতে আপনার অ্যাপটিকে আগের অ্যান্ড্রয়েড রিলিজের মতো তার বিদ্যমান বন্ড লস হ্যান্ডলিং মেকানিজম চালিয়ে যেতে হবে।
ব্লুটুথ বন্ড অপসারণের নতুন উপায়
All apps targeting Android 16 are now able to unpair bluetooth devices using a
public API in CompanionDeviceManager. If a companion device is
being managed as a CDM association, then the app can trigger
bluetooth bond removal by using the new removeBond(int) API
on the associated device. The app can monitor the bond state changes by
listening to the bluetooth device broadcast event
ACTION_BOND_STATE_CHANGED.
নিরাপত্তা
অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬)-এ নিম্নলিখিত নিরাপত্তা পরিবর্তনগুলো অন্তর্ভুক্ত রয়েছে।
মিডিয়াস্টোর সংস্করণ লকডাউন
For apps targeting Android 16 or higher, MediaStore#getVersion() will now
be unique to each app. This eliminates identifying properties from the version
string to prevent abuse and usage for fingerprinting techniques. Apps shouldn't
make any assumptions around the format of this version. Apps should already
handle version changes when using this API and in most cases shouldn't need to
change their current behavior, unless the developer has attempted to infer
additional information that is beyond the intended scope of this API.
নিরাপদ উদ্দেশ্য
সেফার ইনটেন্টস ফিচারটি একটি বহু-পর্যায়ের নিরাপত্তা উদ্যোগ, যা অ্যান্ড্রয়েডের ইনটেন্ট রেজোলিউশন মেকানিজমের নিরাপত্তা উন্নত করার জন্য ডিজাইন করা হয়েছে। এর লক্ষ্য হলো ইনটেন্ট প্রসেসিংয়ের সময় চেক যুক্ত করে এবং নির্দিষ্ট মানদণ্ড পূরণ না করা ইনটেন্টগুলোকে ফিল্টার করার মাধ্যমে অ্যাপগুলোকে ক্ষতিকর কার্যকলাপ থেকে রক্ষা করা।
অ্যান্ড্রয়েড ১৫- এ এই ফিচারটি প্রেরক অ্যাপকে কেন্দ্র করে তৈরি হয়েছিল। এখন অ্যান্ড্রয়েড ১৬-তে নিয়ন্ত্রণ প্রাপক অ্যাপের হাতে চলে গেছে, যা ডেভেলপারদের তাদের অ্যাপ ম্যানিফেস্ট ব্যবহার করে কঠোর ইনটেন্ট রেজোলিউশন বেছে নেওয়ার সুযোগ করে দিয়েছে।
দুটি গুরুত্বপূর্ণ পরিবর্তন বাস্তবায়ন করা হচ্ছে:
সুস্পষ্ট ইনটেন্ট অবশ্যই টার্গেট কম্পোনেন্টের ইনটেন্ট ফিল্টারের সাথে মিলতে হবে: যদি কোনো ইনটেন্ট সুস্পষ্টভাবে কোনো কম্পোনেন্টকে টার্গেট করে, তবে সেটিকে অবশ্যই সেই কম্পোনেন্টের ইনটেন্ট ফিল্টারের সাথে মিলতে হবে।
অ্যাকশনবিহীন ইন্টেন্ট কোনো ইন্টেন্ট ফিল্টারের সাথে মেলানো যাবে না: যেসব ইন্টেন্টে কোনো অ্যাকশন নির্দিষ্ট করা নেই, সেগুলোকে কোনো ইন্টেন্ট ফিল্টারে সমাধান করা উচিত নয়।
এই পরিবর্তনগুলি শুধুমাত্র একাধিক অ্যাপ জড়িত থাকলেই প্রযোজ্য হবে এবং একটি একক অ্যাপের মধ্যে ইনটেন্ট হ্যান্ডলিংকে প্রভাবিত করবে না।
প্রভাব
অপ্ট-ইন প্রকৃতির হওয়ায়, এটি কার্যকর করার জন্য ডেভেলপারদের অবশ্যই তাদের অ্যাপ ম্যানিফেস্টে এটি স্পষ্টভাবে সক্রিয় করতে হবে। ফলস্বরূপ, এই ফিচারটির প্রভাব সেইসব অ্যাপের মধ্যেই সীমাবদ্ধ থাকবে, যাদের ডেভেলপাররা:
- সেফার ইনটেন্টস ফিচার এবং এর সুবিধাগুলো সম্পর্কে অবগত আছেন।
- তারা সক্রিয়ভাবে তাদের অ্যাপে আরও কঠোর ইনটেন্ট হ্যান্ডলিং পদ্ধতি অন্তর্ভুক্ত করার সিদ্ধান্ত নেয়।
এই অপ্ট-ইন পদ্ধতিটি এমন বিদ্যমান অ্যাপগুলো ভেঙে যাওয়ার ঝুঁকি কমিয়ে দেয়, যেগুলো বর্তমান কম-সুরক্ষিত ইনটেন্ট রেজোলিউশন আচরণের উপর নির্ভর করতে পারে।
অ্যান্ড্রয়েড ১৬-এ এর প্রাথমিক প্রভাব সীমিত হলেও, সেফার ইনটেন্টস উদ্যোগটির ভবিষ্যৎ অ্যান্ড্রয়েড সংস্করণগুলোতে আরও ব্যাপক প্রভাব ফেলার একটি কর্মপরিকল্পনা রয়েছে। পরিকল্পনাটি হলো, অবশেষে কঠোর ইনটেন্ট রেজোলিউশনকে ডিফল্ট আচরণে পরিণত করা।
সেফার ইনটেন্টস ফিচারটি ইনটেন্ট রেজোলিউশন মেকানিজমের দুর্বলতা কাজে লাগানো ক্ষতিকারক অ্যাপগুলোর জন্য আরও কঠিন করে তোলার মাধ্যমে অ্যান্ড্রয়েড ইকোসিস্টেমের নিরাপত্তা উল্লেখযোগ্যভাবে উন্নত করার সম্ভাবনা রাখে।
তবে, বিদ্যমান অ্যাপগুলোর সাথে সম্ভাব্য সামঞ্জস্যজনিত সমস্যাগুলো সমাধানের জন্য অপ্ট-আউট এবং বাধ্যতামূলক প্রয়োগের দিকে এই পরিবর্তনটি সতর্কতার সাথে পরিচালনা করতে হবে।
বাস্তবায়ন
ডেভেলপারদের তাদের অ্যাপ ম্যানিফেস্টে intentMatchingFlags অ্যাট্রিবিউট ব্যবহার করে আরও কঠোর ইনটেন্ট ম্যাচিং স্পষ্টভাবে সক্রিয় করতে হবে। এখানে একটি উদাহরণ দেওয়া হল যেখানে ফিচারটি পুরো অ্যাপের জন্য অপ্ট-ইন, কিন্তু একজন রিসিভারের জন্য নিষ্ক্রিয়/অপ্ট-আউট করা আছে:
<application android:intentMatchingFlags="enforceIntentFilter">
<receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
<intent-filter>
<action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
</intent-filter>
</receiver>
</application>
সমর্থিত ফ্ল্যাগগুলো সম্পর্কে আরও তথ্য:
| পতাকার নাম | বর্ণনা |
|---|---|
| enforceIntentFilter | আগত ইন্টেন্টগুলির জন্য আরও কঠোর মিলকরণ প্রয়োগ করে। |
| কোনোটিই না | আগত ইন্টেন্টগুলির জন্য সমস্ত বিশেষ ম্যাচিং নিয়ম নিষ্ক্রিয় করে। একাধিক ফ্ল্যাগ নির্দিষ্ট করার সময়, সাংঘর্ষিক মানগুলির সমাধান করার জন্য "none" ফ্ল্যাগটিকে অগ্রাধিকার দেওয়া হয়। |
| নাল অ্যাকশনের অনুমতি দিন | অ্যাকশনবিহীন ইনটেন্টগুলোকেও ম্যাচ করার অনুমতি দিতে ম্যাচিং নিয়ম শিথিল করে। একটি নির্দিষ্ট আচরণ অর্জনের জন্য এই ফ্ল্যাগটি 'enforceIntentFilter'-এর সাথে একত্রে ব্যবহার করতে হবে। |
পরীক্ষা এবং ডিবাগিং
যখন এই নিয়মটি সক্রিয় থাকে, তখন যদি ইন্টেন্ট কলার সঠিকভাবে ইন্টেন্টটি পূরণ করে থাকে, তবে অ্যাপগুলো ঠিকঠাক কাজ করার কথা। তবে, ব্লক করা ইন্টেন্টগুলো "PackageManager" ট্যাগসহ "Intent does not match component's intent filter:" এবং "Access blocked:" এর মতো সতর্কতামূলক লগ বার্তা দেখাবে "PackageManager." এটি একটি সম্ভাব্য সমস্যার ইঙ্গিত দেয় যা অ্যাপটিকে প্রভাবিত করতে পারে এবং এর প্রতি মনোযোগ দেওয়া প্রয়োজন।
লগক্যাট ফিল্টার:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
জিপিইউ সিস্টেম কল ফিল্টারিং
মালি জিপিইউ সারফেসকে আরও সুরক্ষিত করতে, যেসব মালি জিপিইউ IOCTL বাতিল করা হয়েছে বা শুধুমাত্র জিপিইউ ডেভেলপমেন্টের জন্য উদ্দিষ্ট, সেগুলোকে প্রোডাকশন বিল্ডে ব্লক করা হয়েছে। এছাড়াও, জিপিইউ প্রোফাইলিংয়ের জন্য ব্যবহৃত IOCTL-গুলোকে শেল প্রসেস বা ডিবাগযোগ্য অ্যাপ্লিকেশনের মধ্যে সীমাবদ্ধ করা হয়েছে। প্ল্যাটফর্ম-স্তরের পলিসি সম্পর্কে আরও বিস্তারিত জানতে SAC আপডেটটি দেখুন।
এই পরিবর্তনটি মালি জিপিইউ (Mali GPU) ব্যবহারকারী পিক্সেল ডিভাইসগুলিতে (পিক্সেল ৬-৯) কার্যকর হবে। আর্ম (Arm) তাদের r54p2 রিলিজের Documentation/ioctl-categories.rst ফাইলে তাদের IOCTL-গুলোর আনুষ্ঠানিক শ্রেণিবিন্যাস প্রদান করেছে। ভবিষ্যতের ড্রাইভার রিলিজগুলোতেও এই তালিকাটি রক্ষণাবেক্ষণ করা অব্যাহত থাকবে।
এই পরিবর্তনটি সমর্থিত গ্রাফিক্স এপিআই (ভুলকান এবং ওপেনজিএল সহ)-কে প্রভাবিত করে না এবং এটি ডেভেলপার বা বিদ্যমান অ্যাপ্লিকেশনগুলিকে প্রভাবিত করবে বলে আশা করা যায় না। স্ট্রিমলাইন পারফরম্যান্স অ্যানালাইজার এবং অ্যান্ড্রয়েড জিপিইউ ইন্সপেক্টরের মতো জিপিইউ প্রোফাইলিং টুলগুলি প্রভাবিত হবে না।
পরীক্ষা
আপনি যদি নিম্নলিখিতের মতো কোনো SELinux অস্বীকৃতি দেখতে পান, তাহলে সম্ভবত আপনার অ্যাপ্লিকেশনটি এই পরিবর্তনের দ্বারা প্রভাবিত হয়েছে:
06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc: denied { ioctl }
for path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts
আপনার অ্যাপ্লিকেশনে যদি ব্লক করা IOCTL ব্যবহার করার প্রয়োজন হয়, তাহলে অনুগ্রহ করে একটি বাগ রিপোর্ট ফাইল করুন এবং android-partner-security@google.com-এ অ্যাসাইন করুন।
প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী
এই নীতি পরিবর্তনটি কি সকল OEM-এর জন্য প্রযোজ্য? এই পরিবর্তনটি ঐচ্ছিক হবে, তবে যে সকল OEM এই হার্ডেনিং পদ্ধতিটি ব্যবহার করতে ইচ্ছুক, তারা এটি গ্রহণ করতে পারবেন। পরিবর্তনটি বাস্তবায়নের নির্দেশাবলী ইমপ্লিমেন্টেশন ডকুমেন্টেশনে পাওয়া যাবে।
এটি বাস্তবায়নের জন্য OEM কোডবেসে পরিবর্তন আনা কি বাধ্যতামূলক, নাকি এটি নতুন AOSP রিলিজের সাথে ডিফল্টভাবে চলে আসে? প্ল্যাটফর্ম-স্তরের পরিবর্তনটি নতুন AOSP রিলিজের সাথে ডিফল্টভাবে চলে আসবে। ভেন্ডররা চাইলে তাদের কোডবেসে এই পরিবর্তনটি অন্তর্ভুক্ত করতে পারেন।
SoC-গুলো কি IOCTL তালিকা হালনাগাদ রাখার জন্য দায়ী? উদাহরণস্বরূপ, যদি আমার ডিভাইসটি একটি ARM Mali GPU ব্যবহার করে, তাহলে কোনো পরিবর্তনের জন্য কি আমাকে ARM-এর সাথে যোগাযোগ করতে হবে? ড্রাইভার প্রকাশের সাথে সাথে প্রতিটি SoC-কে তাদের ডিভাইসের জন্য IOCTL তালিকা হালনাগাদ করতে হবে। উদাহরণস্বরূপ, ARM ড্রাইভার আপডেটের সময় তাদের প্রকাশিত IOCTL তালিকা হালনাগাদ করবে। তবে, OEM-দের নিশ্চিত করতে হবে যে তারা তাদের SEPolicy-তে এই আপডেটগুলো অন্তর্ভুক্ত করেছে এবং প্রয়োজন অনুযায়ী নির্বাচিত কাস্টম IOCTL-গুলো তালিকায় যুক্ত করেছে।
এই পরিবর্তনটি কি বাজারে থাকা সমস্ত পিক্সেল ডিভাইসে স্বয়ংক্রিয়ভাবে প্রযোজ্য হবে, নাকি এই পরিবর্তনটি প্রয়োগ করার জন্য ব্যবহারকারীকে কিছু টগল করতে হবে? এই পরিবর্তনটি মালি জিপিইউ (Mali GPU) ব্যবহারকারী বাজারে থাকা সমস্ত পিক্সেল ডিভাইসে (পিক্সেল ৬-৯) প্রযোজ্য হবে। এই পরিবর্তনটি প্রয়োগ করার জন্য ব্যবহারকারীর কোনো পদক্ষেপের প্রয়োজন নেই।
এই পলিসির ব্যবহার কি কার্নেল ড্রাইভারের পারফরম্যান্সে প্রভাব ফেলবে? এই পলিসিটি GFXBench ব্যবহার করে মালি জিপিইউ-তে পরীক্ষা করা হয়েছিল এবং জিপিইউ পারফরম্যান্সে কোনো পরিমাপযোগ্য পরিবর্তন লক্ষ্য করা যায়নি।
IOCTL তালিকাটিকে বর্তমান ইউজারস্পেস এবং কার্নেল ড্রাইভার সংস্করণের সাথে সামঞ্জস্যপূর্ণ রাখা কি আবশ্যক? হ্যাঁ, অনুমোদিত IOCTL-এর তালিকাটি অবশ্যই ইউজারস্পেস এবং কার্নেল ড্রাইভার উভয়ের দ্বারা সমর্থিত IOCTL-এর সাথে সিঙ্ক্রোনাইজড হতে হবে। যদি ইউজারস্পেস বা কার্নেল ড্রাইভারের IOCTL-গুলো আপডেট করা হয়, তবে SEPolicy IOCTL তালিকাটিকেও তার সাথে মিলিয়ে আপডেট করতে হবে।
ARM, IOCTL-গুলোকে 'সীমাবদ্ধ' / 'ইনস্ট্রুমেন্টেশন' হিসেবে শ্রেণীবদ্ধ করেছে, কিন্তু আমরা সেগুলোর কয়েকটি প্রোডাকশন ব্যবহারের ক্ষেত্রে ব্যবহার করতে চাই এবং/অথবা অন্যগুলো বাদ দিতে চাই। প্রতিটি OEM/SoC তাদের ইউজারস্পেস মালি লাইব্রেরির কনফিগারেশনের উপর ভিত্তি করে, তারা যে IOCTL-গুলো ব্যবহার করে সেগুলোকে কীভাবে শ্রেণীবদ্ধ করবে, সেই সিদ্ধান্ত নেওয়ার দায়িত্ব তাদেরই। এই বিষয়ে সিদ্ধান্ত নিতে ARM-এর তালিকাটি সাহায্য করতে পারে, কিন্তু প্রতিটি OEM/SoC-এর ব্যবহারের ক্ষেত্র ভিন্ন হতে পারে।
গোপনীয়তা
অ্যান্ড্রয়েড ১৬ (এপিআই লেভেল ৩৬)-এ নিম্নলিখিত গোপনীয়তা পরিবর্তনগুলো অন্তর্ভুক্ত করা হয়েছে।
স্থানীয় নেটওয়ার্ক অনুমতি
具有 INTERNET 权限的任何应用都可以访问局域网中的设备。
这使得应用可以轻松连接到本地设备,但也存在隐私方面的影响,例如形成用户指纹,以及成为位置信息的代理。
本地网络保护项目旨在通过在新的运行时权限后限制对本地网络的访问,来保护用户的隐私。
发布计划
这项变更将分别在 25Q2 和 26Q2 这两个版本之间部署。 开发者必须遵循 25Q2 的相关指南并分享反馈,因为这些保护措施将在后续 Android 版本中强制执行。此外,他们还需要按照以下指南更新依赖于隐式本地网络访问权限的场景,并为用户拒绝和撤消新权限做好准备。
影响
在当前阶段,LNP 是一项选择启用功能,这意味着只有选择启用的应用会受到影响。选择启用阶段的目标是让应用开发者了解应用的哪些部分依赖于隐式本地网络访问权限,以便他们为下一个版本做好权限保护准备。
如果应用使用以下方式访问用户的本地网络,则会受到影响:
- 直接或通过库使用本地网络地址(例如 mDNS 或 SSDP 服务发现协议)上的原始套接字
- 使用可访问本地网络的框架级类(例如 NsdManager)
向本地网络地址发送流量和从本地网络地址接收流量需要本地网络访问权限。下表列出了一些常见情况:
| 应用低级层网络操作 | 需要本地网络权限 |
|---|---|
| 建立出站 TCP 连接 | 是 |
| 接受传入的 TCP 连接 | 是 |
| 发送 UDP 单播、多播、广播 | 是 |
| 接收传入的 UDP 单播、多播、广播 | 是 |
这些限制是在网络堆栈深处实现的,因此适用于所有网络 API。这包括在原生代码或受管理代码中创建的套接字、Cronet 和 OkHttp 等网络库,以及基于这些库实现的任何 API。尝试解析本地网络上的服务(即带有 .local 后缀的服务)将需要本地网络权限。
上述规则的例外情况:
- 如果设备的 DNS 服务器位于本地网络上,则进出该服务器(位于端口 53)的流量不需要本地网络访问权限。
- 使用输出切换器作为其应用内选择器的应用将不需要本地网络权限(更多指南将在 2025 年第 4 季度发布)。
开发者指南(选择启用)
如需选择启用本地网络限制,请执行以下操作:
- 将设备刷写到 25Q2 Beta 3 或更高版本的 build。
- 安装要测试的应用。
在 adb 中切换 Appcompat 标志:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>重启设备
现在,您的应用对本地网络的访问受到限制,任何访问本地网络的尝试都会导致套接字错误。如果您使用的 API 在应用进程之外执行本地网络操作(例如:NsdManager),在选择启用阶段,这些 API 不会受到影响。
如需恢复访问权限,您必须向应用授予 NEARBY_WIFI_DEVICES 权限。
- 确保应用在其清单中声明了
NEARBY_WIFI_DEVICES权限。 - 依次前往设置 > 应用 > [应用名称] > 权限 > 附近的设备 > 允许。
现在,应用对本地网络的访问权限应该已恢复,并且所有场景都应像选择启用应用之前一样正常运行。
本地网络保护功能开始强制执行后,应用的网络流量将受到以下影响。
| 权限 | 出站 LAN 请求 | 出站/入站互联网请求 | 入站 LAN 请求 |
|---|---|---|---|
| 已授予 | Works | Works | Works |
| 未授予 | 最差排行榜 | Works | 最差排行榜 |
使用以下命令关闭应用兼容性标志
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
错误
每当调用套接字调用 send 或 send 变体向本地网络地址发送数据时,系统都会向该套接字返回因这些限制而产生的错误。
错误示例:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
本地网络定义
此项目中的本地网络是指使用支持广播的网络接口(例如 Wi-Fi 或以太网)的 IP 网络,但不包括移动网络 (WWAN) 或 VPN 连接。
以下网络被视为本地网络:
IPv4:
- 169.254.0.0/16 // 链路本地
- 100.64.0.0/10 // CGNAT
- 10.0.0.0/8 // RFC1918
- 172.16.0.0/12 // RFC1918
- 192.168.0.0/16 // RFC1918
IPv6:
- 链路本地
- 直接连接的路线
- Thread 等桩网络
- 多子网(待定)
此外,多播地址 (224.0.0.0/4、ff00::/8) 和 IPv4 广播地址 (255.255.255.255) 也被归类为本地网络地址。