على غرار الإصدارات السابقة، يتضمّن Android 16 تغييرات في السلوك قد تؤثّر في تطبيقك. تنطبق تغييرات السلوك التالية حصريًا على التطبيقات التي تستهدف Android 16 أو الإصدارات الأحدث. إذا كان تطبيقك يستهدف Android 16 أو الإصدارات الأحدث، عليك تعديله ليتوافق مع هذه السلوكيات، حيثما ينطبق ذلك.
احرص أيضًا على مراجعة قائمة تغييرات السلوك التي تؤثّر في جميع التطبيقات
التي تعمل على Android 16 بغض النظر عن targetSdkVersion لتطبيقك.
تجربة المستخدم وواجهة مستخدم النظام
يتضمّن Android 16 (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية التي تهدف إلى إنشاء تجربة مستخدم أكثر تناسقًا وسهولة.
إزالة خيار إيقاف عرض المحتوى بلا حدود
فرض Android 15 العرض حتى حافة الشاشة للتطبيقات التي تستهدف Android 15 (المستوى
35 من واجهة برمجة التطبيقات)، ولكن كان بإمكان تطبيقك إيقاف هذه الميزة عن طريق ضبط
R.attr#windowOptOutEdgeToEdgeEnforcement على true. بالنسبة إلى التطبيقات التي تستهدف Android 16 (المستوى 36 من واجهة برمجة التطبيقات)، تم إيقاف R.attr#windowOptOutEdgeToEdgeEnforcement نهائيًا وتعطيله، ولا يمكن لتطبيقك إيقاف ميزة العرض حتى حافة الشاشة.
- إذا كان تطبيقك يستهدف Android 16 (المستوى 36 من واجهة برمجة التطبيقات) ويعمل على جهاز Android 15، سيستمر
R.attr#windowOptOutEdgeToEdgeEnforcementفي العمل. - إذا كان تطبيقك يستهدف Android 16 (مستوى واجهة برمجة التطبيقات 36) ويعمل على جهاز Android 16، سيتم إيقاف
R.attr#windowOptOutEdgeToEdgeEnforcement.
لإجراء الاختبار في Android 16، تأكَّد من أنّ تطبيقك يتيح العرض حتى حافة الشاشة وأزِل أي استخدام لـ R.attr#windowOptOutEdgeToEdgeEnforcement لكي يتيح تطبيقك أيضًا العرض حتى حافة الشاشة على جهاز Android 15. لإتاحة العرض حتى حافة الشاشة،
يُرجى الاطّلاع على إرشادات Compose وViews.
نقل البيانات أو إيقاف ميزة "إيماءة إظهار شاشة الرجوع" مطلوبان
对于以 Android 16(API 级别 36)或更高版本为目标平台且在 Android 16 或更高版本的设备上运行的应用,预测性返回系统动画(返回主屏幕、跨任务和跨 activity)默认处于启用状态。此外,系统不再调用 onBackPressed,也不再调度 KeyEvent.KEYCODE_BACK。
如果您的应用会拦截返回事件,但您尚未迁移到预测性返回,请更新应用以使用受支持的返回导航 API,或者通过在应用的 AndroidManifest.xml 文件的 <application> 或 <activity> 标记中将 android:enableOnBackInvokedCallback 属性设置为 false 来暂时选择停用。
إيقاف واجهات برمجة التطبيقات للخطوط الأنيقة نهائيًا وإيقاف تفعيلها
في التطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android (المستوى 35 لواجهة برمجة التطبيقات)، يتم ضبط السمة
elegantTextHeight
TextView على القيمة true تلقائيًا، ما يؤدي إلى استبدال الخط المضغوط بخط أكثر قابلية للقراءة. يمكنك إلغاء هذا الإعداد من خلال ضبط السمة elegantTextHeight على false.
في الإصدار 16 من نظام التشغيل Android، سيتم إيقاف السمة
elegantTextHeight،
وسيتم تجاهل السمة عندما يستهدف تطبيقك الإصدار 16 من نظام التشغيل Android. سيتم إيقاف "خطوط واجهة المستخدم" التي تتحكّم فيها واجهات برمجة التطبيقات هذه، لذا عليك تعديل أي تخطيطات لضمان عرض النص بشكل متسق ومناسب للمستقبل باللغات العربية أو اللاوية أو البورمية أو التاميلية أو الغوجاراتية أو الكنادية أو المالايالامية أو الأودية أو التيلوغوية أو التايلاندية.
سلوك elegantTextHeight للتطبيقات التي تستهدف الإصدار 14 من نظام التشغيل Android (المستوى 34 لواجهة برمجة التطبيقات) والإصدارات الأقدم، أو للتطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android (المستوى 35 لواجهة برمجة التطبيقات) والتي تم فيها تجاهل الإعداد التلقائي من خلال ضبط السمة elegantTextHeight على false.
سلوك elegantTextHeight للتطبيقات التي تستهدف الإصدار 16 من نظام التشغيل Android (المستوى 36 لواجهة برمجة التطبيقات)، أو للتطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android (المستوى 35 لواجهة برمجة التطبيقات) والتي لم
تتجاوز الإعداد التلقائي من خلال ضبط السمة elegantTextHeight
على false.الوظيفة الأساسية
يتضمّن Android 16 (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية التي تعدِّل أو توسِّع إمكانات أساسية مختلفة في نظام Android.
تحسين جدولة العمل بمعدّل ثابت
قبل استهداف الإصدار 16 من Android، عندما يفوت scheduleAtFixedRate
تنفيذ مهمة بسبب عدم التزامه بدورة حياة
صالحة للعمليات، يتم تنفيذ جميع عمليات التنفيذ الفائتة
على الفور عند عودة التطبيق إلى دورة حياة صالحة.
عند استهداف Android 16، يتم تنفيذ مرة واحدة على الأكثر من عملية تنفيذ
scheduleAtFixedRate الفائتة على الفور عندما يعود التطبيق
إلى دورة حياة صالحة. من المتوقّع أن يؤدي تغيير السلوك هذا إلى تحسين أداء التطبيق. يمكنك اختبار هذا السلوك في تطبيقك لمعرفة ما إذا كان تطبيقك متأثرًا.
يمكنك أيضًا إجراء الاختبار باستخدام إطار عمل توافق التطبيقات
وتفعيل علامة التوافق STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS.
أشكال الأجهزة
يتضمّن Android 16 (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية للتطبيقات عند عرضها على الأجهزة ذات الشاشات الكبيرة.
التنسيقات التكيّفية
现在,Android 应用可在各种设备(例如手机、平板电脑、可折叠设备、桌面设备、汽车和电视)上运行,并且在大屏设备上支持多种窗口模式(例如分屏和桌面窗口化模式),因此开发者应构建能够适应任何屏幕和窗口尺寸的 Android 应用,无论设备屏幕方向如何。在当今的多设备世界中,限制屏幕方向和尺寸可调整性等范式过于严格。
忽略屏幕方向、尺寸可调整性和宽高比限制
对于以 Android 16(API 级别 36)为目标平台的应用,屏幕方向、尺寸可调整性和宽高比限制不再适用于最小宽度 >= 600dp 的显示屏。无论宽高比或用户偏好的屏幕方向如何,应用都会填满整个显示窗口,且不会采用竖条模式。
此变更引入了新的标准平台行为。Android 正在向一种模型转变,在该模型中,应用需要适应各种屏幕方向、显示大小和宽高比。固定屏幕方向或有限的尺寸调整等限制会阻碍应用的适应性。使应用具有自适应性,以提供尽可能最佳的用户体验。
您还可以使用应用兼容性框架并启用 UNIVERSAL_RESIZABLE_BY_DEFAULT 兼容性标志来测试此行为。
常见的重大更改
忽略屏幕方向、可调整大小性和宽高比限制可能会影响应用在某些设备上的界面,尤其是那些专为锁定为纵向的小布局设计的元素,例如布局拉伸、动画和组件超出屏幕等问题。任何关于宽高比或屏幕方向的假设都可能导致应用出现视觉问题。详细了解如何避免这些问题并改进应用的自适应行为。
允许设备旋转会导致更多 activity 重新创建,如果未正确保留,可能会导致用户状态丢失。如需了解如何正确保存界面状态,请参阅保存界面状态。
实现细节
在全屏模式和多窗口模式下,以下清单属性和运行时 API 会被大屏设备忽略:
screenOrientationresizableActivityminAspectRatiomaxAspectRatiosetRequestedOrientation()getRequestedOrientation()
系统会忽略 screenOrientation、setRequestedOrientation() 和 getRequestedOrientation() 的以下值:
portraitreversePortraitsensorPortraituserPortraitlandscapereverseLandscapesensorLandscapeuserLandscape
对于显示屏可调整大小性,android:resizeableActivity="false"、android:minAspectRatio 和 android:maxAspectRatio 没有影响。
对于以 Android 16(API 级别 36)为目标平台的应用,默认情况下,大屏设备会忽略应用的屏幕方向、可调整尺寸性和宽高比限制,但尚未完全准备就绪的每个应用都可以选择停用此行为,从而暂时替换此行为(这会导致应用恢复到之前放置在兼容模式下的行为)。
例外情况
在以下情况下,Android 16 的屏幕方向、尺寸调整能力和宽高比限制不适用:
- 游戏(基于
android:appCategory标志) - 用户在设备的宽高比设置中明确选择启用应用的默认行为
- 小于
sw600dp的屏幕
暂时选择不接收
如需选择停用特定 activity,请声明 PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY 清单属性:
<activity ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
...
</activity>
如果您的应用有太多部分尚未准备好支持 Android 16,您可以在应用级别应用相同的属性,从而完全选择不启用该功能:
<application ...>
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>
الصحة واللياقة البدنية
يتضمّن Android 16 (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية المتعلقة ببيانات الصحة واللياقة البدنية.
أذونات الصحة واللياقة البدنية
对于以 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 (مستوى واجهة برمجة التطبيقات 36) التغييرات التالية في حزمة بروتوكول Bluetooth لتحسين إمكانية الاتصال بالأجهزة الطرفية.
أهداف جديدة للتعامل مع فقدان الربط والتغييرات في التشفير
كجزء من المعالجة المحسّنة لفقدان الربط، يقدّم نظام التشغيل Android 16 أيضًا هدفَين جديدَين لمنح التطبيقات وعيًا أكبر بفقدان الربط وتغييرات التشفير.
يمكن للتطبيقات التي تستهدف الإصدار 16 من Android الآن تنفيذ ما يلي:
- تلقّي نية
ACTION_KEY_MISSINGعند رصد فقدان الربط عن بُعد ، ما يتيح لهم تقديم ملاحظات أكثر إفادة للمستخدمين واتّخاذ الإجراءات المناسبة - تلقّي نية
ACTION_ENCRYPTION_CHANGEعند تغيير حالة التشفير للرابط ويشمل ذلك تغيير حالة التشفير وتغيير خوارزمية التشفير وتغيير حجم مفتاح التشفير. يجب أن تُعتبر التطبيقات قد أعادت الربط إذا تم تشفير الرابط بنجاح عند تلقّيACTION_ENCRYPTION_CHANGEintent لاحقًا.
التكيّف مع عمليات التنفيذ المختلفة التي يجريها المصنّعون الأصليون للأجهزة
على الرغم من أنّ الإصدار 16 من Android يقدّم هذه النوايا الجديدة، يمكن أن يختلف تنفيذها ونقلها على مستوى الشركات المصنّعة للأجهزة المختلفة. لضمان أن يقدّم تطبيقك تجربة متّسقة وموثوقة على جميع الأجهزة، على المطوّرين تصميم آلية معالجة فقدان الربط للتكيّف بسلاسة مع هذه الاختلافات المحتملة.
ننصحك باتّباع سلوكيات التطبيقات التالية:
في حال بثّ نية
ACTION_KEY_MISSING:سيقطع النظام ربط ACL (الربط غير المتزامن)، ولكن سيتم الاحتفاظ بمعلومات الربط للجهاز (على النحو описан هنا).
يجب أن يستخدم تطبيقك هذا الإذن كإشارة أساسية لرصد فقدان الربط وإرشاد المستخدم إلى التأكّد من أنّ الجهاز البعيد ضمن النطاق قبل بدء عملية محو بيانات الجهاز أو إعادة إقرانه.
إذا انقطع اتصال أحد الأجهزة بعد تلقّي
ACTION_KEY_MISSING، يجب أن يتعامل تطبيقك بحذر مع إعادة الاتصال، لأنّه قد لا يكون الجهاز مرتبطًا بالنظام بعد ذلك.في حال عدم بث نية
ACTION_KEY_MISSING:سيظل رابط ACL متصلاً، وسيزيل النظام معلومات الربط للجهاز، تمامًا كما هو الحال في Android 15.
في هذا السيناريو، من المفترض أن يواصل تطبيقك استخدام آليات التعامل مع فقدان الربط الحالية كما في إصدارات Android السابقة، لرصد أحداث فقدان الربط وإدارتها.
طريقة جديدة لإزالة ربط Bluetooth
يمكن الآن لجميع التطبيقات التي تستهدف الإصدار 16 من Android إلغاء إقران الأجهزة التي تتضمّن بلوتوث باستخدام واجهة برمجة التطبيقات
العامة في CompanionDeviceManager. إذا كان يتم
إدارة جهاز مصاحب كربط إدارة الخدمات الجوّالة للمؤسسات، يمكن للتطبيق بدء
إزالة الربط عبر البلوتوث باستخدام واجهة برمجة التطبيقات removeBond(int) الجديدة
على الجهاز المرتبط. يمكن للتطبيق مراقبة التغييرات في حالة الربط من خلال
الاستماع إلى حدث البث لجهاز البلوتوث
ACTION_BOND_STATE_CHANGED.
الأمان
يتضمّن Android 16 (المستوى 36 من واجهة برمجة التطبيقات) تغييرات الأمان التالية.
إيقاف إصدار MediaStore
بالنسبة إلى التطبيقات التي تستهدف الإصدار 16 من نظام التشغيل Android أو الإصدارات الأحدث، سيصبح MediaStore#getVersion()
فريدًا لكل تطبيق. ويؤدي ذلك إلى إزالة السمات التعريفية من سلسلة الإصدار
لمنع إساءة الاستخدام والاستفادة من تقنيات تحديد الهوية. ويجب ألا تفترض التطبيقات
أيّ شيء بشأن تنسيق هذا الإصدار. من المفترض أن تتمكّن التطبيقات من التعامل مع تغييرات الإصدار عند استخدام واجهة برمجة التطبيقات هذه، وفي معظم الحالات، لن تحتاج التطبيقات إلى تغيير سلوكها الحالي، ما لم يحاول المطوّر استنتاج معلومات إضافية تتجاوز النطاق المقصود لواجهة برمجة التطبيقات هذه.
الأهداف الأكثر أمانًا
ميزة "نوايا أكثر أمانًا" هي مبادرة أمان متعددة المراحل مصمّمة لتحسين أمان آلية تحليل الأهداف في Android. الهدف هو حماية التطبيقات من الإجراءات الضارة من خلال إضافة عمليات تحقّق أثناء معالجة الأهداف وفلترة الأهداف التي لا تستوفي معايير معيّنة.
في Android 15، ركّزت الميزة على تطبيق المرسِل، ولكن مع Android 16، أصبح تطبيق المتلقي هو الذي يتحكّم في العملية، ما يتيح للمطوّرين تفعيل ميزة تحليل الأهداف بدقة باستخدام بيان التطبيق.
يتم تنفيذ تغييريَن رئيسيَّين:
يجب أن تتطابق الأهداف الصريحة (Explicit Intents) مع فلتر Intent الخاص بالمكوِّن المستهدف: إذا كانت الأهداف الصريحة تستهدف مكوِّنًا بشكل صريح، يجب أن تتطابق مع فلتر Intent الخاص بهذا المكوِّن.
لا يمكن أن تتطابق الأهداف بدون إجراء مع أي فلتر Intent: يجب ألا يتم تحليل الأهداف التي لم يتم تحديد إجراء لها إلى أي فلتر Intent.
لا تسري هذه التغييرات إلا عندما يتضمّن الأمر تطبيقات متعدّدة، ولا تؤثر في معالجة الأهداف داخل تطبيق واحد.
التأثير
بما أنّ هذه الميزة تتطلّب منح الموافقة، على المطوّرين تفعيلها صراحةً في بيان التطبيق لكي يصبح لها تأثير. نتيجةً لذلك، سيقتصر تأثير الميزة على التطبيقات التي:
- أن تكون على دراية بميزة "نوايا أكثر أمانًا" وفوائدها
- تختار بنشاط دمج ممارسات أكثر صرامة لمعالجة الأهداف في تطبيقاتها
يقلّل هذا النهج الذي يتطلّب منح الموافقة من خطر إيقاف التطبيقات الحالية التي قد تعتمد على السلوك الحالي الأقل أمانًا لتحليل الأهداف.
على الرغم من أنّ التأثير الأوّلي لمبادرة "نوايا أكثر أمانًا" في Android 16 قد يكون محدودًا، إلا أنّ هناك خارطة طريق لتحقيق تأثير أوسع في إصدارات Android المستقبلية. ونخطّط في النهاية لجعل حلّ النية الصارمة هو السلوك التلقائي.
يمكن أن تؤدي ميزة "نقل نوايا أكثر أمانًا" إلى تحسين أمان منظومة Android المتكاملة بشكل كبير من خلال الحد من قدرة التطبيقات الضارة على استغلال الثغرات الأمنية في آلية تحديد الغرض.
ومع ذلك، يجب إدارة عملية الانتقال إلى إيقاف الميزة وفرضها بشكل إلزامي بعناية لمعالجة مشاكل التوافق المحتملة مع التطبيقات الحالية.
التنفيذ
على المطوّرين تفعيل مطابقة الأهداف الأكثر صرامة صراحةً باستخدام السمة 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 | يوقف جميع قواعد المطابقة الخاصة للأهداف الواردة. عند تحديد علامات متعدّدة، يتم حلّ القيم المتعارضة من خلال منح الأولوية للعلامة "none" |
| allowNullAction | يخفّف قواعد المطابقة للسماح بمطابقة الأهداف بدون إجراء. يجب استخدام هذه العلامة مع "enforceIntentFilter" لتحقيق سلوك معيّن |
الاختبار وتحديد المشاكل وحلّها
عندما يكون فرض الميزة مفعّلاً، يجب أن تعمل التطبيقات بشكل صحيح إذا ملأ المتصل بالهدف الهدف بشكل صحيح.
ومع ذلك، ستؤدي الأهداف المحظورة إلى ظهور رسائل سجلّ تحذير، مثل
"Intent does not match component's intent filter:" و "Access blocked:"
مع العلامة "PackageManager."
يشير ذلك إلى مشكلة محتملة قد تؤثر في التطبيق وتتطلب
الانتباه.
فلتر Logcat:
tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")
فلترة طلبات النظام لوحدة معالجة الرسومات
لتعزيز أمان سطح Mali GPU، تم حظر واجهات IOCTL الخاصة بوحدة معالجة الرسومات Mali التي تم إيقافها أو التي يُقصد استخدامها فقط لتطوير وحدة معالجة الرسومات في إصدارات الإنتاج. بالإضافة إلى ذلك، تم حصر واجهات IOCTL المستخدَمة لإنشاء ملفات تعريف وحدة معالجة الرسومات في عملية shell أو التطبيقات التي يمكن تصحيح أخطائها. يُرجى الرجوع إلى تعديل اتفاقية المطوّرين للنشر لمزيد من التفاصيل حول السياسة على مستوى النظام الأساسي.
يتم تطبيق هذا التغيير على أجهزة Pixel التي تستخدم وحدة معالجة الرسومات Mali (من Pixel 6 إلى Pixel 9). قدّمت شركة Arm
تصنيفًا رسميًا لواجهات IOCTL في
Documentation/ioctl-categories.rst في إصدار r54p2. وسيتم الحفاظ على هذه القائمة في إصدارات برامج التشغيل المستقبلية.
لا يؤثّر هذا التغيير في واجهات برمجة التطبيقات للرسومات المتوافقة (بما في ذلك Vulkan وOpenGL)، ومن غير المتوقّع أن يؤثّر في المطوّرين أو التطبيقات الحالية. لن تتأثر أدوات إنشاء ملفات تعريف وحدة معالجة الرسومات، مثل Streamline Performance Analyzer وAndroid GPU Inspector.
الاختبار
إذا ظهر لك رفض من 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.
الأسئلة الشائعة
هل ينطبق هذا التغيير في السياسة على جميع المصنّعين الأصليين للأجهزة؟ سيكون هذا التغيير اختياريًا، ولكنّه سيكون متاحًا لأي مصنّع أصلي للجهاز يريد استخدام طريقة التعزيز هذه. يمكن العثور على تعليمات تنفيذ التغيير في مستندات التنفيذ.
هل من الضروري إجراء تغييرات في قاعدة رموز المصنّع الأصلي للجهاز لتنفيذ هذا التغيير، أم أنّه يأتي مع إصدار جديد من AOSP تلقائيًا؟ سيأتي التغيير على مستوى النظام الأساسي مع إصدار جديد من AOSP تلقائيًا. يمكن للمورّدين الموافقة على هذا التغيير في قاعدة الرموز الخاصة بهم إذا أرادوا تطبيقه.
هل وحدات النظام على شريحة (SoC) مسؤولة عن إبقاء قائمة واجهات IOCTL محدّثة؟ على سبيل المثال، إذا كان جهازي يستخدم وحدة معالجة الرسومات ARM Mali، هل أحتاج إلى التواصل مع ARM لإجراء أي من التغييرات؟ يجب أن تعدّل وحدات النظام على شريحة (SoC) الفردية قوائم واجهات IOCTL الخاصة بها لكل جهاز عند إصدار برنامج التشغيل. على سبيل المثال، ستعدّل ARM قائمة واجهات IOCTL المنشورة عند إجراء تعديلات على برنامج التشغيل. ومع ذلك، على المصنّعين الأصليين للأجهزة التأكّد من دمج التعديلات في سياسة SELinux، وإضافة أي واجهات IOCTL مخصّصة تم اختيارها إلى القوائم حسب الحاجة.
هل ينطبق هذا التغيير تلقائيًا على جميع أجهزة Pixel المتوفّرة في السوق، أم يجب أن يتّخذ المستخدم إجراءً لتفعيل خيار ما من أجل تطبيق هذا التغيير؟ ينطبق هذا التغيير على جميع أجهزة Pixel المتوفّرة في السوق والتي تستخدم وحدة معالجة الرسومات Mali (من Pixel 6 إلى Pixel 9). ليس على المستخدم اتّخاذ أي إجراء لتطبيق هذا التغيير.
هل سيؤثّر استخدام هذه السياسة في أداء برنامج تشغيل النواة؟ تم اختبار هذه السياسة على وحدة معالجة الرسومات Mali باستخدام GFXBench، ولم يتم رصد أي تغيير قابل للقياس في أداء وحدة معالجة الرسومات.
هل من الضروري أن تتطابق قائمة واجهات IOCTL مع الإصدارات الحالية من مساحة المستخدم وبرنامج تشغيل النواة؟ نعم، يجب مزامنة قائمة واجهات IOCTL المسموح بها مع واجهات IOCTL التي يتيحها كل من مساحة المستخدم وبرامج تشغيل النواة. إذا تم تعديل واجهات IOCTL في مساحة المستخدم أو برنامج تشغيل النواة، يجب تعديل قائمة واجهات IOCTL في سياسة SELinux لتتطابق معها.
صنّفت ARM واجهات IOCTL على أنّها "مقيّدة" أو "أدوات قياس"، ولكن نريد استخدام بعضها في حالات الاستخدام في الإنتاج و/أو رفض البعض الآخر. يكون المصنّعون الأصليون للأجهزة أو وحدات النظام على شريحة (SoC) الفردية مسؤولين عن تحديد كيفية تصنيف واجهات IOCTL التي يستخدمونها، استنادًا إلى إعداد مكتبات Mali في مساحة المستخدم. يمكن استخدام قائمة ARM للمساعدة في اتّخاذ هذه القرارات، ولكن قد تختلف حالة استخدام كل مصنّع أصلي للجهاز أو وحدة نظام على شريحة (SoC).
الخصوصية
يتضمّن Android 16 (المستوى 36 من واجهة برمجة التطبيقات) تغييرات الخصوصية التالية.
إذن الوصول إلى الشبكة المحلية
يمكن لأي تطبيق لديه إذن INTERNET الوصول إلى الأجهزة على الشبكة المحلية.
يسهّل ذلك على التطبيقات الاتصال بالأجهزة المحلية، ولكن له أيضًا آثار على الخصوصية، مثل إنشاء بصمة للمستخدم والعمل كخادم وكيل للموقع الجغرافي.
يهدف مشروع "حماية الشبكة المحلية" إلى حماية خصوصية المستخدم من خلال حصر الوصول إلى الشبكة المحلية بإذن تشغيل جديد.
خطة الإصدار
سيتم طرح هذا التغيير بين إصدارَين، 25Q2 و26Q2 على التوالي. من الضروري أن يتبع المطوّرون هذه الإرشادات في الربع الثاني من عام 2025 وأن يشاركوا ملاحظاتهم لأنّ هذه الحمايات سيتم فرضها في إصدار Android لاحق. علاوةً على ذلك، سيحتاج المطوّرون إلى تعديل السيناريوهات التي تعتمد على الوصول الضمني إلى الشبكة المحلية باتّباع الإرشادات التالية والاستعداد لرفض المستخدمين وإلغاء الإذن الجديد.
التأثير
في المرحلة الحالية، تكون ميزة "الشبكة المحلية فقط" اختيارية، ما يعني أنّها ستؤثر فقط في التطبيقات التي فعّلتها. والهدف من مرحلة الموافقة هو أن يفهم مطوّرو التطبيقات الأجزاء التي تعتمد على الوصول الضمني إلى الشبكة المحلية، حتى يتمكّنوا من الاستعداد لحماية الأذونات في الإصدار التالي.
ستتأثر التطبيقات إذا كانت تصل إلى الشبكة المحلية للمستخدم باستخدام:
- الاستخدام المباشر أو استخدام المكتبة للمقابس الأولية على عناوين الشبكة المحلية (مثل بروتوكول mDNS أو SSDP لاكتشاف الخدمات)
- استخدام فئات على مستوى إطار العمل يمكنها الوصول إلى الشبكة المحلية (مثل NsdManager)
يتطلّب نقل البيانات إلى عنوان شبكة محلية ومنه منح الإذن بالوصول إلى الشبكة المحلية. يسرد الجدول التالي بعض الحالات الشائعة:
| عملية الشبكة المنخفضة المستوى للتطبيق | يجب منح الإذن بالوصول إلى الشبكة المحلية |
|---|---|
| إجراء اتصال TCP صادر | نعم |
| قبول اتصالات TCP الواردة | نعم |
| إرسال بث أحادي أو بث متعدّد أو بث عادي عبر UDP | نعم |
| تلقّي بث أحادي أو متعدد أو عادي وارد عبر UDP | نعم |
يتم تنفيذ هذه القيود في أعماق حزمة الشبكات، وبالتالي فهي تنطبق على جميع واجهات برمجة التطبيقات الخاصة بالشبكات. ويشمل ذلك المقابس التي تم إنشاؤها في الرمز البرمجي الأصلي أو المُدار، ومكتبات الشبكات مثل Cronet وOkHttp، وأي واجهات برمجة تطبيقات تم تنفيذها فوق هذه المكتبات. ستتطلّب محاولة حلّ الخدمات على الشبكة المحلية (أي تلك التي تتضمّن اللاحقة .local) الحصول على إذن بالوصول إلى الشبكة المحلية.
استثناءات من القواعد أعلاه:
- إذا كان خادم نظام أسماء النطاقات الخاص بالجهاز على شبكة محلية، لن تتطلّب حركة بيانات الشبكة الواردة إليه أو الصادرة منه (على المنفذ 53) إذن الوصول إلى الشبكة المحلية.
- لن تحتاج التطبيقات التي تستخدم أداة Output Switcher كأداة اختيار داخل التطبيق إلى أذونات الوصول إلى الشبكة المحلية (ستتوفّر المزيد من الإرشادات في الربع الرابع من عام 2025).
إرشادات للمطوّرين (تتطلّب الموافقة)
لتفعيل القيود على الشبكة المحلية، اتّبِع الخطوات التالية:
- تثبيت إصدار يتضمّن الإصدار التجريبي 3 من 25Q2 أو إصدارًا أحدث على الجهاز
- ثبِّت التطبيق الذي تريد اختباره.
بدِّل علامة Appcompat في adb:
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>إعادة تشغيل الجهاز
سيتم الآن تقييد وصول تطبيقك إلى الشبكة المحلية، وسيؤدي أي محاولة للوصول إلى الشبكة المحلية إلى حدوث أخطاء في المقبس. إذا كنت تستخدم واجهات برمجة تطبيقات تنفّذ عمليات على الشبكة المحلية خارج عملية تطبيقك (مثل NsdManager)، لن تتأثّر هذه العمليات خلال مرحلة الموافقة.
لاستعادة إذن الوصول، يجب منح تطبيقك الإذن بالوصول إلى NEARBY_WIFI_DEVICES.
- تأكَّد من أنّ التطبيق يعرّف إذن
NEARBY_WIFI_DEVICESفي ملف البيان الخاص به. - انتقِل إلى الإعدادات > التطبيقات > [اسم التطبيق] > الأذونات > الأجهزة المجاورة > السماح.
من المفترض الآن أن يكون قد تم استعادة إذن وصول تطبيقك إلى الشبكة المحلية، وأن تعمل جميع السيناريوهات كما كانت قبل منح التطبيق الإذن.
بعد بدء تطبيق ميزة الحماية من الشبكات المحلية، سيتم التأثير في حركة بيانات شبكة التطبيق على النحو التالي:
| الإذن | Outbound LAN Request | طلب الإنترنت الصادر/الوارد | طلب شبكة LAN وارد |
|---|---|---|---|
| تم منح الأذونات | Works | Works | Works |
| لم يتم المنح | الإخفاقات | Works | الإخفاقات |
استخدِم الأمر التالي لإيقاف علامة App-Compat
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
الأخطاء
سيتم عرض الأخطاء الناتجة عن هذه القيود في مقبس الاتصال الذي تم استدعاؤه عندما يتم استدعاء الأمر send أو أحد متغيراته إلى عنوان شبكة محلية.
أمثلة على الأخطاء:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
تعريف الشبكة المحلية
تشير الشبكة المحلية في هذا المشروع إلى شبكة IP تستخدم واجهة شبكة متوافقة مع البث، مثل Wi-Fi أو Ethernet، ولكنها لا تشمل اتصالات شبكة الجوّال (WWAN) أو شبكة VPN.
تُعدّ الشبكات التالية شبكات محلية:
IPv4:
- 169.254.0.0/16 // Link Local
- 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:
- Link-local
- المسارات المرتبطة مباشرةً
- شبكات الأجهزة الوهمية، مثل Thread
- الشبكات الفرعية المتعددة (يُحدَّد لاحقًا)
بالإضافة إلى ذلك، يتم تصنيف كل من عناوين البث المتعدد (224.0.0.0/4 وff00::/8) وعنوان البث IPv4 (255.255.255.255) كعناوين شبكة محلية.
الصور التي يملكها التطبيق
عندما يطلب تطبيق يستهدف الإصدار 36 من حزمة SDK أو إصدارًا أحدث على الأجهزة التي تعمل بالإصدار 16 من نظام التشغيل Android أو إصدارًا أحدث أذونات الوصول إلى الصور والفيديوهات، سيظهر للمستخدمين الذين يختارون حصر الوصول إلى الوسائط المحدّدة أي صور يملكها التطبيق تم اختيارها مسبقًا في أداة اختيار الصور. يمكن للمستخدمين إلغاء اختيار أي من هذه العناصر المحدّدة مسبقًا، ما سيؤدي إلى إبطال إذن وصول التطبيق إلى هذه الصور والفيديوهات.