تغييرات في السلوك: التطبيقات التي تستهدف الإصدار 16 من نظام التشغيل Android أو الإصدارات الأحدث

كما هو الحال في الإصدارات السابقة، يتضمّن Android 16 تغييرات في السلوك قد تؤثر في تطبيقك. تنطبق تغييرات السلوك التالية حصريًا على التطبيقات التي تستهدف Android 16 أو الإصدارات الأحدث. إذا كان تطبيقك يستهدف الإصدار 16 من نظام التشغيل Android أو الإصدارات الأحدث، عليك تعديل تطبيقك ليتوافق مع هذه السلوكيات، حيثما ينطبق ذلك.

احرص أيضًا على مراجعة قائمة التغييرات في السلوك التي تؤثّر في جميع التطبيقات التي تعمل على 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.

يجب نقل البيانات أو إيقاف إيماءة إظهار شاشة الرجوع

بالنسبة إلى التطبيقات التي تستهدف الإصدار 16 من نظام التشغيل Android (المستوى 36 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث وتعمل على جهاز Android 16 أو إصدار أحدث، يتم تفعيل الصور المتحركة لنظام إيماءة إظهار شاشة الرجوع (الرجوع إلى الشاشة الرئيسية والتنقّل بين المهام والتنقّل بين الأنشطة) تلقائيًا. بالإضافة إلى ذلك، لا يتم استدعاء onBackPressed ولا يتم إرسال KeyEvent.KEYCODE_BACK بعد الآن.

إذا كان تطبيقك يعترض حدث الرجوع ولم تنتقل بعد إلى ميزة "الرجوع التوقّعي"، عليك تعديل تطبيقك لاستخدام واجهات برمجة التطبيقات المتوافقة مع ميزة "الرجوع" أو إيقاف الميزة مؤقتًا من خلال ضبط السمة android:enableOnBackInvokedCallback على false في العلامة <application> أو <activity> من ملف AndroidManifest.xml الخاص بتطبيقك.

الصورة المتحركة لإيماءة الرجوع التوقّعية إلى الشاشة الرئيسية
الصورة المتحركة التنبؤية بين الأنشطة
الصورة المتحركة التنبؤية التي تظهر عند التنقّل بين المهام:

إيقاف واجهات برمجة التطبيقات الخاصة بالخطوط الأنيقة نهائيًا

في التطبيقات التي تستهدف الإصدار 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 تتكيّف مع أي حجم للشاشة والنافذة، بغض النظر عن اتجاه الجهاز. إنّ نماذج التصميم، مثل حصر الاتجاه وإمكانية تغيير الحجم، أصبحت مقيّدة جدًا في عالم اليوم الذي يضم أجهزة متعددة.

تجاهل القيود المفروضة على الاتجاه وإمكانية تغيير الحجم ونسبة العرض إلى الارتفاع

بالنسبة إلى التطبيقات التي تستهدف الإصدار 16 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 36)، لم تعُد قيود الاتجاه وتغيير الحجم ونسبة العرض إلى الارتفاع تنطبق على الشاشات التي يبلغ عرضها الأصغر 600 وحدة بكسل مستقلة الكثافة (dp) أو أكثر. تملأ التطبيقات نافذة العرض بأكملها، بغض النظر عن نسبة العرض إلى الارتفاع أو اتجاه الشاشة المفضّل لدى المستخدم، ولا يتم استخدام وضع "العمودين الجانبيين".

يقدّم هذا التغيير سلوكًا جديدًا للمنصة. يتجه نظام التشغيل Android نحو نموذج يُتوقّع فيه أن تتكيّف التطبيقات مع مختلف الاتجاهات وأحجام العرض ونِسب العرض إلى الارتفاع. تؤدي القيود، مثل التوجيه الثابت أو إمكانية تغيير الحجم المحدودة، إلى إعاقة قدرة التطبيق على التكيّف. اجعل تطبيقك قابلاً للتكيّف لتقديم أفضل تجربة مستخدم ممكنة.

يمكنك أيضًا اختبار هذا السلوك باستخدام اختبار توافق التطبيقات وتفعيل علامة التوافق UNIVERSAL_RESIZABLE_BY_DEFAULT.

التغييرات الشائعة التي قد تؤدي إلى أعطال

قد يؤدي تجاهل القيود المفروضة على اتجاه الشاشة وإمكانية تغيير حجمها ونسبة العرض إلى الارتفاع إلى التأثير في واجهة المستخدم لتطبيقك على بعض الأجهزة، خاصةً العناصر المصمَّمة للتنسيقات الصغيرة التي لا يمكن تغيير اتجاهها إلى الوضع الأفقي، مثل المشاكل المتعلقة بالتنسيقات الممدودة والرسوم المتحركة والمكوّنات التي تظهر خارج الشاشة. يمكن أن تتسبّب أي افتراضات بشأن نسبة العرض إلى الارتفاع أو اتجاه الشاشة في حدوث مشاكل مرئية في تطبيقك. مزيد من المعلومات حول كيفية تجنُّب هذه المشاكل وتحسين السلوك التكيّفي لتطبيقك

يؤدي السماح بتدوير الجهاز إلى إعادة إنشاء المزيد من الأنشطة، ما قد يؤدي إلى فقدان حالة المستخدم إذا لم يتم الاحتفاظ بها بشكل صحيح. تعرَّف على كيفية حفظ حالة واجهة المستخدم بشكل صحيح في مقالة حفظ حالات واجهة المستخدم.

تفاصيل التنفيذ

يتم تجاهل سمات البيان وواجهات برمجة التطبيقات لوقت التشغيل التالية على الأجهزة ذات الشاشات الكبيرة في وضعَي ملء الشاشة والنوافذ المتعددة:

يتم تجاهل القيم التالية الخاصة بـ screenOrientation وsetRequestedOrientation() وgetRequestedOrientation():

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

في ما يتعلق بإمكانية تغيير حجم شاشة العرض، ليس هناك أي تأثير على android:resizeableActivity="false" وandroid:minAspectRatio وandroid:maxAspectRatio.

بالنسبة إلى التطبيقات التي تستهدف الإصدار Android 16 (المستوى 36 لواجهة برمجة التطبيقات)، يتم تلقائيًا تجاهل قيود اتجاه التطبيق وتغيير حجمه ونسبة العرض إلى الارتفاع على الشاشات الكبيرة. يمكن لكل تطبيق غير جاهز تمامًا إلغاء هذا السلوك مؤقتًا من خلال إيقافه، ما يؤدي إلى السلوك السابق المتمثل في وضعه في وضع التوافق.

الاستثناءات

لا تنطبق قيود الاتجاه وتغيير الحجم ونسبة العرض إلى الارتفاع في Android 16 في الحالات التالية:

  • الألعاب (استنادًا إلى علامة android:appCategory)
  • المستخدمون الذين يوافقون صراحةً على السلوك التلقائي للتطبيق في إعدادات نسبة العرض إلى الارتفاع على الجهاز
  • الشاشات التي يقل حجمها عن sw600dp

إيقاف الميزة مؤقتًا

لإيقاف نشاط معيّن، عليك تعريف السمة 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 (مستوى واجهة برمجة التطبيقات 36) أو الإصدارات الأحدث، BODY_SENSORS تستخدم أذونات أكثر دقة ضمن android.permissions.health، والتي يستخدمها أيضًا Health Connect. بدءًا من الإصدار Android 16، تتطلّب أي واجهة برمجة تطبيقات كانت تتطلّب في السابق الإذن BODY_SENSORS أو BODY_SENSORS_BACKGROUND تتطلّب الإذن المقابل android.permissions.health بدلاً من ذلك. ويؤثّر ذلك في أنواع البيانات وواجهات برمجة التطبيقات وأنواع الخدمات التي تعمل في المقدّمة التالية:

إذا كان تطبيقك يستخدم واجهات برمجة التطبيقات هذه، عليه طلب الأذونات الدقيقة المقابلة:

  • لمراقبة معدّل نبضات القلب أو نسبة تشبّع الأكسجين بالدم أو درجة حرارة الجلد أثناء الاستخدام: اطلب الإذن الدقيق ضمن android.permissions.health، مثل READ_HEART_RATE بدلاً من BODY_SENSORS.
  • للوصول إلى أجهزة الاستشعار في الخلفية: اطلب READ_HEALTH_DATA_IN_BACKGROUND بدلاً من BODY_SENSORS_BACKGROUND.

هذه الأذونات هي نفسها التي تحمي الوصول إلى قراءة البيانات من Health Connect، وهو مخزن بيانات Android لبيانات الصحة، اللياقة البدنية والعافية.

تطبيقات الأجهزة الجوّالة

يجب أن تُعلن تطبيقات الأجهزة الجوّالة التي تنقل بياناتها لاستخدام READ_HEART_RATE والأذونات الدقيقة الأخرى عن نشاط لعرض سياسة خصوصية التطبيق. هذا هو الشرط نفسه في Health Connect.

إمكانية الاتصال

يتضمّن نظام التشغيل Android 16 (المستوى 36 من واجهة برمجة التطبيقات) التغييرات التالية في حزمة البلوتوث لتحسين الاتصال بالأجهزة الطرفية.

أهداف جديدة للتعامل مع فقدان الربط والتغييرات في التشفير

作为改进了对键值对丢失的处理的一部分,Android 16 还引入了 2 个新 intent,以便应用更好地了解键值对丢失和加密更改。

以 Android 16 为目标平台的应用现在可以:

  • 在检测到远程键盘连接丢失时接收 ACTION_KEY_MISSING intent,以便提供更具信息量的用户反馈并采取适当的措施。
  • 每当链接的加密状态发生变化时,都会收到 ACTION_ENCRYPTION_CHANGE intent。这包括加密状态更改、加密算法更改和加密密钥大小更改。如果应用在稍后收到 ACTION_ENCRYPTION_CHANGE intent 时成功加密了链接,则必须将该绑定视为已恢复。

适应不同的 OEM 实现

虽然 Android 16 引入了这些新 intent,但其实现和广播可能会因不同的设备制造商 (OEM) 而异。为了确保您的应用在所有设备上都能提供一致且可靠的体验,开发者应设计其绑定丢失处理机制,以妥善适应这些潜在的变化。

我们建议您采用以下应用行为:

  • 如果广播 ACTION_KEY_MISSING intent:

    系统会断开 ACL(异步无连接)链接,但会保留设备的配对信息(如此处所述)。

    您的应用应将此 intent 用作检测配对丢失的主要信号,并在发起设备忘记或重新配对之前引导用户确认远程设备是否在范围内。

    如果设备在收到 ACTION_KEY_MISSING 后断开连接,您的应用应谨慎重新连接,因为设备可能已不再与系统绑定。

  • 如果未广播 ACTION_KEY_MISSING intent:

    ACL 链接将保持连接状态,系统会移除设备的配对信息,与 Android 15 中的行为相同。

    在这种情况下,您的应用应继续使用与之前的 Android 版本相同的现有配对丢失处理机制,以检测和管理配对丢失事件。

طريقة جديدة لإزالة ربط البلوتوث

يمكن الآن لجميع التطبيقات التي تستهدف الإصدار 16 من Android إلغاء إقران الأجهزة التي تتضمّن بلوتوث باستخدام واجهة برمجة التطبيقات العامة في CompanionDeviceManager. إذا كان يتم إدارة جهاز مصاحب كربط إدارة الخدمات الجوّالة للمؤسسات، يمكن للتطبيق بدء إزالة الربط عبر البلوتوث باستخدام واجهة برمجة التطبيقات removeBond(int) الجديدة على الجهاز المرتبط. يمكن للتطبيق مراقبة التغييرات في حالة الربط من خلال الاستماع إلى حدث البث لجهاز البلوتوث ACTION_BOND_STATE_CHANGED.

الأمان

يتضمّن نظام التشغيل Android 16 (المستوى 36 لواجهة برمجة التطبيقات) تغييرات الأمان التالية.

قفل إصدار MediaStore

بالنسبة إلى التطبيقات التي تستهدف الإصدار 16 من نظام التشغيل Android أو الإصدارات الأحدث، سيصبح MediaStore#getVersion() فريدًا لكل تطبيق. ويؤدي ذلك إلى إزالة السمات التعريفية من سلسلة الإصدار لمنع إساءة الاستخدام والاستفادة من تقنيات تحديد الهوية. ويجب ألا تفترض التطبيقات أيّ شيء بشأن تنسيق هذا الإصدار. من المفترض أن تتمكّن التطبيقات من التعامل مع تغييرات الإصدار عند استخدام واجهة برمجة التطبيقات هذه، وفي معظم الحالات، لن تحتاج التطبيقات إلى تغيير سلوكها الحالي، ما لم يحاول المطوّر استنتاج معلومات إضافية تتجاوز النطاق المقصود لواجهة برمجة التطبيقات هذه.

Safer Intents

“更安全的 intent”功能是一项多阶段安全计划,旨在提高 Android 的 intent 解析机制的安全性。目标是在 intent 处理期间添加检查,并过滤不符合特定条件的 intent,从而保护应用免受恶意操作的侵害。

Android 15 中,该功能侧重于发送应用。现在,在 Android 16 中,控制权转移到了接收应用,开发者可以使用其应用清单选择启用严格的 intent 解析。

我们正在实施两项关键变更:

  1. 显式 intent 必须与目标组件的 intent 过滤器匹配:如果 intent 显式定位到某个组件,则应与该组件的 intent 过滤器匹配。

  2. 没有操作的 intent 无法匹配任何 intent 过滤器:未指定操作的 intent 不应解析为任何 intent 过滤器。

这些变更仅在涉及多个应用时适用,不会影响单个应用内的 intent 处理。

影响

选择启用性质意味着,开发者必须在应用清单中明确启用它,才能使其生效。 因此,此功能的影响将仅限于以下应用:

  • 了解“更安全的 intent”功能及其优势。
  • 主动选择在应用中采用更严格的 intent 处理实践。

这种选择性采用的方法可最大限度地降低破坏可能依赖于当前不太安全的 intent 解析行为的现有应用的风险。

虽然 Safer Intents 计划在 Android 16 中的初始影响可能有限,但其路线图表明,该计划将在未来的 Android 版本中产生更广泛的影响。我们计划最终将严格的意图解析设为默认行为。

通过使恶意应用更难利用 intent 解析机制中的漏洞,“更安全的 intent”功能有望显著提升 Android 生态系统的安全性。

不过,向选择停用和强制执行的过渡必须谨慎管理,以解决现有应用可能存在的兼容性问题。

实现

开发者需要在应用清单中使用 intentMatchingFlags 属性明确启用更严格的 intent 匹配。以下示例展示了如何为整个应用选择启用该功能,但在接收器上停用/选择停用该功能:

<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 对传入的 intent 强制执行更严格的匹配
针对传入 intent 停用所有特殊匹配规则。指定多个标志时,系统会优先考虑“无”标志,以解决值冲突问题
allowNullAction 放宽匹配规则,以允许匹配没有操作的 intent。此标志应与“enforceIntentFilter”结合使用,以实现特定行为

测试和调试

在强制执行处于有效状态时,如果 intent 调用方已正确填充 intent,应用应能正常运行。 不过,被屏蔽的 intent 会触发警告日志消息(例如 "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.

الأسئلة الشائعة

  1. هل ينطبق هذا التغيير في السياسة على جميع المصنّعين الأصليين للأجهزة؟ سيكون هذا التغيير اختياريًا، ولكنّه سيكون متاحًا لأي مصنّع أصلي للجهاز يريد استخدام طريقة التعزيز هذه. يمكن العثور على تعليمات تنفيذ التغيير في مستندات التنفيذ.

  2. هل من الضروري إجراء تغييرات في قاعدة رموز المصنّع الأصلي للجهاز لتنفيذ هذا التغيير، أم أنّه يأتي مع إصدار جديد من AOSP تلقائيًا؟ سيأتي التغيير على مستوى النظام الأساسي مع إصدار جديد من AOSP تلقائيًا. يمكن للمورّدين الموافقة على هذا التغيير في قاعدة الرموز الخاصة بهم إذا أرادوا تطبيقه.

  3. هل وحدات النظام على شريحة (SoC) مسؤولة عن إبقاء قائمة واجهات IOCTL محدّثة؟ على سبيل المثال، إذا كان جهازي يستخدم وحدة معالجة الرسومات ARM Mali، هل أحتاج إلى التواصل مع ARM لإجراء أي من التغييرات؟ يجب أن تعدّل وحدات النظام على شريحة (SoC) الفردية قوائم واجهات IOCTL الخاصة بها لكل جهاز عند إصدار برنامج التشغيل. على سبيل المثال، ستعدّل ARM قائمة واجهات IOCTL المنشورة عند إجراء تعديلات على برنامج التشغيل. ومع ذلك، على المصنّعين الأصليين للأجهزة التأكّد من دمج التعديلات في سياسة SELinux، وإضافة أي واجهات IOCTL مخصّصة تم اختيارها إلى القوائم حسب الحاجة.

  4. هل ينطبق هذا التغيير تلقائيًا على جميع أجهزة Pixel المتوفّرة في السوق، أم يجب أن يتّخذ المستخدم إجراءً لتفعيل خيار ما من أجل تطبيق هذا التغيير؟ ينطبق هذا التغيير على جميع أجهزة Pixel المتوفّرة في السوق والتي تستخدم وحدة معالجة الرسومات Mali (من Pixel 6 إلى Pixel 9). ليس على المستخدم اتّخاذ أي إجراء لتطبيق هذا التغيير.

  5. هل سيؤثّر استخدام هذه السياسة في أداء برنامج تشغيل النواة؟ تم اختبار هذه السياسة على وحدة معالجة الرسومات Mali باستخدام GFXBench، ولم يتم رصد أي تغيير قابل للقياس في أداء وحدة معالجة الرسومات.

  6. هل من الضروري أن تتطابق قائمة واجهات IOCTL مع الإصدارات الحالية من مساحة المستخدم وبرنامج تشغيل النواة؟ نعم، يجب مزامنة قائمة واجهات IOCTL المسموح بها مع واجهات IOCTL التي يتيحها كل من مساحة المستخدم وبرامج تشغيل النواة. إذا تم تعديل واجهات IOCTL في مساحة المستخدم أو برنامج تشغيل النواة، يجب تعديل قائمة واجهات IOCTL في سياسة SELinux لتتطابق معها.

  7. صنّفت ARM واجهات IOCTL على أنّها "مقيّدة" أو "أدوات قياس"، ولكن نريد استخدام بعضها في حالات الاستخدام في الإنتاج و/أو رفض البعض الآخر. يكون المصنّعون الأصليون للأجهزة أو وحدات النظام على شريحة (SoC) الفردية مسؤولين عن تحديد كيفية تصنيف واجهات IOCTL التي يستخدمونها، استنادًا إلى إعداد مكتبات Mali في مساحة المستخدم. يمكن استخدام قائمة ARM للمساعدة في اتّخاذ هذه القرارات، ولكن قد تختلف حالة استخدام كل مصنّع أصلي للجهاز أو وحدة نظام على شريحة (SoC).

الخصوصية

يتضمّن الإصدار 16 من نظام التشغيل Android (المستوى 36 من واجهة برمجة التطبيقات) تغييرات الخصوصية التالية.

إذن الوصول إلى الشبكة المحلية

يمكن لأي تطبيق لديه إذن INTERNET الوصول إلى الأجهزة على الشبكة المحلية. يسهّل ذلك على التطبيقات الاتصال بالأجهزة المحلية، ولكن له أيضًا آثار على الخصوصية، مثل إنشاء بصمة للمستخدم والعمل كخادم وكيل للموقع الجغرافي.

يهدف مشروع "حماية الشبكة المحلية" إلى حماية خصوصية المستخدم من خلال حصر الوصول إلى الشبكة المحلية بإذن تشغيل جديد.

خطة الإصدار

سيتم طرح هذا التغيير بين إصدارَين، 25Q2 و26Q2 على التوالي. من الضروري أن يتبع المطوّرون هذه الإرشادات في الربع الثاني من عام 2025 وأن يشاركوا ملاحظاتهم لأنّ هذه الحمايات سيتم فرضها في إصدار Android لاحق. علاوةً على ذلك، سيحتاج المطوّرون إلى تعديل السيناريوهات التي تعتمد على الوصول الضمني إلى الشبكة المحلية باتّباع الإرشادات التالية والاستعداد لرفض المستخدمين وإلغاء الإذن الجديد.

التأثير

في المرحلة الحالية، تكون ميزة "الشبكة المحلية فقط" اختيارية، ما يعني أنّها ستؤثر فقط في التطبيقات التي فعّلتها. والهدف من مرحلة الموافقة هو أن يفهم مطوّرو التطبيقات الأجزاء التي تعتمد على الوصول الضمني إلى الشبكة المحلية، حتى يتمكّنوا من الاستعداد لحماية الأذونات في الإصدار التالي.

ستتأثر التطبيقات إذا كانت تصل إلى الشبكة المحلية للمستخدم باستخدام:

  • الاستخدام المباشر أو استخدام المكتبة للمقابس الأولية على عناوين الشبكة المحلية (مثل بروتوكول mDNS أو SSDP لاكتشاف الخدمات)
  • استخدام فئات على مستوى إطار العمل يمكنها الوصول إلى الشبكة المحلية (مثل NsdManager)

يتطلّب نقل البيانات إلى عنوان شبكة محلية ومنه منح الإذن بالوصول إلى الشبكة المحلية. يسرد الجدول التالي بعض الحالات الشائعة:

عملية الشبكة المنخفضة المستوى للتطبيق يجب منح الإذن بالوصول إلى الشبكة المحلية
إجراء اتصال TCP صادر نعم
قبول اتصالات TCP الواردة نعم
إرسال بث أحادي أو بث متعدّد أو بث عادي عبر UDP نعم
تلقّي بث أحادي أو متعدد أو عادي وارد عبر UDP نعم

يتم تنفيذ هذه القيود في أعماق حزمة الشبكات، وبالتالي فهي تنطبق على جميع واجهات برمجة التطبيقات الخاصة بالشبكات. ويشمل ذلك المقابس التي تم إنشاؤها في الرمز البرمجي الأصلي أو المُدار، ومكتبات الشبكات مثل Cronet وOkHttp، وأي واجهات برمجة تطبيقات تم تنفيذها فوق هذه المكتبات. ستتطلّب محاولة حلّ الخدمات على الشبكة المحلية (أي تلك التي تتضمّن اللاحقة .local) الحصول على إذن بالوصول إلى الشبكة المحلية.

استثناءات من القواعد أعلاه:

  • إذا كان خادم نظام أسماء النطاقات الخاص بالجهاز على شبكة محلية، لن تتطلّب حركة بيانات الشبكة الواردة إليه أو الصادرة منه (على المنفذ 53) إذن الوصول إلى الشبكة المحلية.
  • لن تحتاج التطبيقات التي تستخدم أداة Output Switcher كأداة اختيار داخل التطبيق إلى أذونات الوصول إلى الشبكة المحلية (ستتوفّر المزيد من الإرشادات في الربع الرابع من عام 2025).

إرشادات للمطوّرين (تتطلّب الموافقة)

لتفعيل القيود على الشبكة المحلية، اتّبِع الخطوات التالية:

  1. تثبيت إصدار يتضمّن الإصدار التجريبي 3 من 25Q2 أو إصدارًا أحدث على الجهاز
  2. ثبِّت التطبيق الذي تريد اختباره.
  3. بدِّل علامة Appcompat في adb:

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. إعادة تشغيل الجهاز

سيتم الآن تقييد وصول تطبيقك إلى الشبكة المحلية، وسيؤدي أي محاولة للوصول إلى الشبكة المحلية إلى حدوث أخطاء في المقبس. إذا كنت تستخدم واجهات برمجة تطبيقات تنفّذ عمليات على الشبكة المحلية خارج عملية تطبيقك (مثل NsdManager)، لن تتأثّر هذه العمليات خلال مرحلة الموافقة.

لاستعادة إذن الوصول، يجب منح تطبيقك الإذن بالوصول إلى NEARBY_WIFI_DEVICES.

  1. تأكَّد من أنّ التطبيق يعرّف إذن NEARBY_WIFI_DEVICES في ملف البيان الخاص به.
  2. انتقِل إلى الإعدادات > التطبيقات > [اسم التطبيق] > الأذونات > الأجهزة المجاورة > السماح.

من المفترض الآن أن يكون قد تم استعادة إذن وصول تطبيقك إلى الشبكة المحلية، وأن تعمل جميع السيناريوهات كما كانت قبل منح التطبيق الإذن.

بعد بدء تطبيق ميزة الحماية من الشبكات المحلية، سيتم التأثير في حركة بيانات شبكة التطبيق على النحو التالي:

الإذن 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 أو إصدارًا أحدث أذونات الوصول إلى الصور والفيديوهات، سيظهر للمستخدمين الذين يختارون حصر الوصول إلى الوسائط المحدّدة أي صور يملكها التطبيق تم اختيارها مسبقًا في أداة اختيار الصور. يمكن للمستخدمين إلغاء اختيار أي من هذه العناصر المحدّدة مسبقًا، ما سيؤدي إلى إبطال إذن وصول التطبيق إلى هذه الصور والفيديوهات.