يمكن لأي تطبيق لديه إذن INTERNET الوصول إلى الأجهزة على شبكة المنطقة المحلية (LAN).
يسهّل ذلك على التطبيقات الاتصال بالأجهزة المحلية، ولكنّه يحمل أيضًا آثارًا على الخصوصية، مثل إنشاء بصمة للمستخدم واستخدام الجهاز كخادم وكيل للموقع الجغرافي.
يهدف مشروع "حماية الشبكة المحلية" إلى حماية خصوصية المستخدم من خلال حظر الوصول إلى الشبكة المحلية إلا بعد منح إذن جديد في وقت التشغيل.
التأثير
خلال الإصدار Android 16، يكون هذا الإذن ميزة اختيارية، ما يعني أنّ التطبيقات التي تختار تفعيلها فقط ستتأثر بها. والهدف من تفعيلها هو أن يفهم مطوّرو التطبيقات الأجزاء التي تعتمد على الوصول الضمني إلى الشبكة المحلية حتى يتمكّنوا من إعداد حماية الأذونات لها في إصدار Android مستقبلي.
ستتأثر التطبيقات إذا وصلت إلى الشبكة المحلية للمستخدم باستخدام:
- الاستخدام المباشر أو استخدام المكتبة للمآخذ الأولية على عناوين الشبكة المحلية، مثل
Multicast DNS (mDNS)أوSimple Service Discovery Protocol (SSDP) - استخدام الفئات على مستوى الإطار التي تصل إلى الشبكة المحلية، مثل
NsdManager
تفاصيل التأثير
تتطلب حركة البيانات من عنوان شبكة محلية وإليه إذن الوصول إلى الشبكة المحلية. يسرد الجدول التالي بعض الحالات الشائعة:
| عملية الشبكة على مستوى منخفض في التطبيق | إذن الشبكة المحلية المطلوب |
|---|---|
| إنشاء اتصال TCP صادر | نعم |
| قبول اتصال TCP وارد | نعم |
| إرسال بث أحادي أو بث متعدد أو بث عادي عبر بروتوكول UDP | نعم |
| تلقّي بث أحادي أو بث متعدد أو بث عادي وارد عبر بروتوكول UDP | نعم |
يتم تطبيق هذه القيود في أسفل حزمة الشبكات، وبالتالي تنطبق على جميع واجهات برمجة التطبيقات للشبكات. ويشمل ذلك المآخذ التي تم إنشاؤها في النظام الأساسي أو الرمز البرمجي المُدار، ومكتبات الشبكات مثل Cronet وOkHttp، وأي واجهات برمجة تطبيقات تم تنفيذها فوقها. تتطلب محاولة حلّ الخدمات على الشبكة المحلية التي لها لاحقة .local إذن الشبكة المحلية.
استثناءات للقواعد السابقة:
- إذا كان خادم نظام أسماء النطاقات (DNS) لجهاز على شبكة محلية، لا تتطلب حركة البيانات من هذا الخادم وإليه (على المنفذ 53) إذن الوصول إلى الشبكة المحلية.
- لن تحتاج التطبيقات التي تستخدم "مبدّل الإخراج" كأداة اختيار داخل التطبيق إلى أذونات الشبكة المحلية (ستتوفّر المزيد من الإرشادات في إصدار لاحق).
إجراءات التنفيذ في Android 17
بدءًا من الإصدار Android 17، تكون حمايات الشبكة المحلية إلزامية ويتم فرضها على التطبيقات التي تستهدف الإصدار Android 17 أو إصدارًا أحدث.
| جانب | Android 16 | Android 17 |
|---|---|---|
| حزمة SDK المستهدفة | 36 | 37 أو أعلى |
| الإذن | NEARBY_WIFI_DEVICES (مستخدَم مؤقتًا) | ACCESS_LOCAL_NETWORK |
| الوصول التلقائي | الوصول إلى الشبكة المحلية مفتوح | يتم حظر الشبكة المحلية تلقائيًا لجميع التطبيقات التي تحدِّث حزمة SDK المستهدَفة |
| مجموعة أذونات | جزء من مجموعة أذونات NEARBY_DEVICES الحالية | |
للتأكّد من عدم تعطُّل وظائف التطبيق بعد فرض إجراءات التنفيذ، يجب أن تتّبع التطبيقات التي تستهدف حزمة SDK 37 أو إصدارًا أحدث أحد المسارات التالية لإدارة الوصول إلى الشبكة المحلية:
المسار "أ": استخدام أدوات اختيار تحافظ على الخصوصية
بالنسبة إلى مهام الاكتشاف والاتصال التي يتوسّط فيها النظام، استخدِم أدوات الاختيار لتجنُّب طلب إذن وقت التشغيل الواسع النطاق بالكامل. استخدِم أدوات الاختيار التالية استنادًا إلى حالة الاستخدام:
- بث الوسائط: بالنسبة إلى التطبيقات التي تتيح Google Cast، يمكنها استخدام
ميزة "مبدّل الإخراج". يتيح ذلك للمطوّرين السماح للمستخدمين باختيار أجهزة بث معيّنة بدون أن يطلب التطبيق إذن النطاق الواسع.
ACCESS_LOCAL_NETWORK - الاتصال العام: يتضمّن
NsdManagerأداة اختيار خدمة يديرها النظام لاكتشاف mDNS. بدلاً من أن يفحص التطبيق الشبكة بأكملها، يعرض النظام مربّع حوار يسمح للمستخدم باختيار جهاز واحد ليتمكّن التطبيق من الوصول إليه.
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
.setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
.build()
nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
// Handle the user-selected and discovered service
// NsdServiceInfo.getHostAddresses() can now be connected to
// without ACCESS_LOCAL_NETWORK permission
}
})
المسار "ب": طلب إذن وقت التشغيل (وصول واسع النطاق)
هذا المسار مطلوب لحالات الاستخدام المعقّدة، مثل أتمتة المنزل أو إدارة أجهزة إنترنت الأشياء التي تحتاج إلى وصول واسع النطاق ومستمر إلى الشبكة المحلية.
الإعلان عن الإذن في البيان: أعلِن صراحةً عن
ACCESS_LOCAL_NETWORKفيAndroidManifest.xml.طلب الإذن في وقت التشغيل: قبل محاولة الوصول إلى أي شبكة محلية، يجب أن تتحقّق التطبيقات مما إذا تم منح الإذن. إذا لم يتم منحه، يجب أن تستدعي
Activity.requestPermission()لتفعيل طلب النظام العادي.سيناريو المنح المسبق: إنّ إذن
ACCESS_LOCAL_NETWORKهو جزء من مجموعة أذوناتNEARBY_DEVICES. إذا سبق للمستخدم منح إذن آخر في هذه المجموعة (مثل أذونات Bluetooth)، لن يُطلب منه مرة أخرى منح إذن الوصول إلى الشبكة المحلية.التعامل مع الرفض والإبطال: يجب أن تتعامل التطبيقات بشكل ملائم مع الحالات التي يرفض فيها المستخدم الطلب أو يبطل الإذن لاحقًا في إعدادات النظام. في مثل هذه السيناريوهات، سيتم حظر حركة البيانات على الشبكة المحلية.
استراتيجية عدّاد إعادة ضبط طلب الإذن
تنفّذ المنصة استراتيجية إعادة ضبط العداد التي تعالج السيناريوهات التي
منع فيها الرفض السابق لمجموعة أذونات NEARBY_DEVICES
(التي تتضمّن الآن ACCESS_LOCAL_NETWORK) التطبيق من طلب
الإذن بعد تقديم مبرّراته بشكل كافٍ. تمنح هذه الآلية
فرصًا إضافية للتطبيق لاستدعاء واجهة برمجة التطبيقات requestPermission()
، ما يؤدي إلى إعادة ضبط عدد الرفض لإذن ACCESS_LOCAL_NETWORK. يسمح ذلك بإعادة تفاعل أكثر دقة مع المستخدم، خاصةً عندما حدث الرفض الأولي قبل أن يتمكّن التطبيق من توضيح ضرورة الوصول إلى الشبكة المحلية لوظائفه الأساسية.
نموذج الإذن المنفصل
يستخدم إذن الشبكة المحلية استراتيجية نقل الإذن المنفصل للتعامل مع التطبيقات الجديدة والتطبيقات القديمة بشكل مختلف، استنادًا إلى حزمة SDK المستهدَفة.
| الفئة | مستوى حزمة SDK المستهدَفة | سلوك الوصول إلى الشبكة المحلية | الإجراء المطلوب من المطوّر |
|---|---|---|---|
| التطبيقات الجديدة / التطبيقات المحدَّثة | >= 37 (Android 17) | محظور تلقائيًا | الإعلان عن إذن وقت التشغيل ACCESS_LOCAL_NETWORK وطلبه |
| التطبيقات القديمة | < 37 | تحصل التطبيقات التي لديها إذن INTERNET على إذن ضمني لـ ACCESS_LOCAL_NETWORK، ما يسمح لها بالاحتفاظ بإمكانية الوصول. هذا الإذن مؤقت وسيتم حظره تلقائيًا بمجرد أن تزيد حزمة SDK المستهدَفة للتطبيق إلى 37 |
لا يلزم إجراء أي تغيير فوري على الرمز البرمجي. لا تطلب إذن ACCESS_LOCAL_NETWORK في وقت التشغيل قبل استهداف حزمة SDK 37. |
استراتيجية "حماية الشبكة المحلية" حسب حالة الاستخدام
إرسال المحتوى: بالنسبة إلى وظائف إرسال الوسائط، فإنّ الاستراتيجية الأكثر ملاءمة والتي تحافظ على الخصوصية هي استخدام مبدّل الإخراج. تسمح هذه الطريقة للنظام بمعالجة اكتشاف الشبكة المحلية والاتصال بها نيابةً عن المستخدم، ما يزيل حاجة التطبيق إلى طلب
ACCESS_LOCAL_NETWORKإذن.المتصفّحات: يتطلب التعامل مع الأخطاء اتّباع نُهج مختلفة استنادًا إلى البروتوكول. تؤدي أخطاء UDP إلى رمز الخطأ
EPERM. بالنسبة إلى اتصالات TCP، يجب أن تستخدم المتصفّحات واجهة برمجة تطبيقات NDKandroid_getnetworkblockedreason(int sockFd)لتحديد ما إذا تم حظر حزمة من قِبل "حماية الشبكة المحلية"، وتعرض واجهة برمجة التطبيقات هذهANDROID_NETWORK_BLOCKED_REASON_LNP.حالات الاستخدام الأخرى (مثل إنترنت الأشياء): يجب أن تستخدم التطبيقات التي تعثر على الأجهزة باستخدام mDNS العلامة
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKERالتي تسمح بالعثور على الأجهزة بدون الإذن، وNsdManager#registerServiceInfoCallback/NsdManager#resolveServiceللحصول على عناوين IP. لا تتطلب الاتصالات بعناوين IP التي يتم الحصول عليها بهذه الطريقة إذنACCESS_LOCAL_NETWORK.
بالنسبة إلى التطبيقات التي تتطلب اتصالاً مباشرًا بالشبكة المحلية ولا يمكنها استخدام أدوات الاختيار التي يتوسّط فيها النظام، فإنّ النهج المقترَح هو استخدام استراتيجية عدّاد إعادة ضبط الإذن عند استهداف الإصدار Android 17 (حزمة SDK 37) أو إصدارًا أحدث. إذا أبطل المستخدم إذن
ACCESS_LOCAL_NETWORK، توفّر هذه الآلية
فرصًا إضافية للتطبيق لإعادة طلب الإذن،
ما يسمح للمطوّرين بتقديم مبرّرات أوضح للمستخدم.
إرشادات Android 16
لتفعيل القيود على الشبكة المحلية، اتّبِع الخطوات التالية:
- تثبيت صورة نظام على جهازك تتضمّن الإصدار Android 16 Beta 3 أو إصدارًا أحدث
- تثبيت التطبيق المطلوب اختباره
تبديل إعدادات Appcompat باستخدام adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>إعادة تشغيل الجهاز
الآن، تم تقييد وصول تطبيقك إلى الشبكة المحلية وأي محاولة للوصول إلى الشبكة المحلية تؤدي إلى حدوث أخطاء في المآخذ.
إذا كنت تستخدم واجهات برمجة تطبيقات تُجري عمليات على الشبكة المحلية خارج عملية تطبيقك (مثل NsdManager)، لن تتأثر هذه الواجهات أثناء تفعيل الميزة.
لاستعادة إمكانية الوصول، يجب منح تطبيقك إذن NEARBY_WIFI_DEVICES.
- تأكَّد من أنّ التطبيق يعلن عن إذن
NEARBY_WIFI_DEVICESفيmanifest. - انتقِل إلى الإعدادات > التطبيقات > [اسم التطبيق] > الأذونات > الأجهزة القريبة > السماح
يجب الآن استعادة إمكانية وصول تطبيقك إلى الشبكة المحلية ويجب أن تعمل جميع السيناريوهات كما كانت قبل تفعيل الميزة في التطبيق. في ما يلي كيفية تأثُّر حركة بيانات شبكة التطبيق.
| الإذن | طلب صادر من شبكة المنطقة المحلية | طلب صادر/وارد من الإنترنت | طلب وارد من شبكة المنطقة المحلية |
|---|---|---|---|
| تم منح الأذونات | Works | Works | Works |
| لم يتم المنح | الإخفاقات | Works | الإخفاقات |
استخدِم الأمر التالي لإيقاف إعدادات Appcompat
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
الأخطاء
إذا تعذّر طلب الوصول إلى الشبكة المحلية بسبب عدم توفّر الإذن:
ستؤدي اتصالات TCP عادةً إلى خطأ في انتهاء المهلة.
ستؤدي أخطاء UDP ورفض الأذونات العامة عادةً إلى رمز الخطأ EPERM.
أخطاء
أرسِل الأخطاء والملاحظات بشأن:
- التناقضات في الوصول إلى شبكة المنطقة المحلية (لا تعتقد أنّه يجب اعتبار وصول معيّن وصولاً إلى "الشبكة المحلية")
- الأخطاء التي يجب فيها حظر الوصول إلى شبكة المنطقة المحلية ولكن لا يتم ذلك
- الأخطاء التي لا يجب فيها حظر الوصول إلى شبكة المنطقة المحلية ولكن يتم ذلك
لن يتأثر ما يلي بهذا التغيير:
- إمكانية الوصول إلى شبكة الإنترنت
- شبكة الجوّال