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

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

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

التأثير

اعتبارًا من الإصدار 17 من Android (مستوى واجهة برمجة التطبيقات 37)، يتم فرض إجراءات الحماية على الشبكة المحلية للتطبيقات التي تستهدف الإصدار 17 من Android أو الإصدارات الأحدث. تم إيقاف الإعدادات السابقة للموافقة على Android 16 نهائيًا. يُرجى الاطّلاع على متطلبات التنفيذ في Android 17 لمعرفة متطلبات التنفيذ الحالية.

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

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

تفاصيل التأثير

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

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

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

استثناءات القواعد السابقة:

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

إجراءات التنفيذ في Android 17

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

جانب Android 16 Android 17
حزمة SDK المستهدفة 36 ‫37 أو أعلى
الإذن تم استخدام NEARBY_WIFI_DEVICES مؤقتًا ACCESS_LOCAL_NETWORK
الوصول التلقائي الوصول إلى الشبكة المحلية مفتوح يتم حظر الشبكة المحلية تلقائيًا لجميع التطبيقات التي تعدّل حزمة تطوير البرامج (SDK) المستهدَفة
مجموعة أذونات جزء من مجموعة أذونات NEARBY_DEVICES الحالية

للتأكّد من أنّ وظائف التطبيق تعمل بشكل صحيح بعد تنفيذ السياسة، يجب أن تتّبع التطبيقات التي تستهدف الإصدار 37 من حزمة تطوير البرامج (SDK) أو الإصدارات الأحدث أحد المسارات التالية لإدارة الوصول إلى الشبكة المحلية:

المسار "أ": استخدام أدوات اختيار تحافظ على الخصوصية

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

  • بث الوسائط: يمكن للتطبيقات التي تتوافق مع 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. إذا سبق أن منح المستخدم إذنًا آخر في هذه المجموعة (مثل أذونات البلوتوث)، لن يُطلب منه مرة أخرى منح إذن الوصول إلى الشبكة المحلية.

  • التعامل مع الرفض والإبطال: يجب أن تتعامل التطبيقات بشكل سلس مع الحالات التي يرفض فيها المستخدم الطلب أو يُبطل الإذن لاحقًا في إعدادات النظام. في هذه الحالات، سيتم حظر حركة بيانات الشبكة المحلية.

استراتيجية إعادة ضبط عدّاد طلبات الحصول على الأذونات

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

استراتيجية LNP حسب حالة الاستخدام

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

  • المتصفّحات: تتطلّب معالجة الأخطاء طرقًا مختلفة استنادًا إلى البروتوكول. تؤدي أخطاء UDP إلى ظهور رمز الخطأ EPERM. بالنسبة إلى اتصالات بروتوكول التحكّم بالنقل (TCP)، يجب أن تستخدم المتصفّحات واجهة برمجة التطبيقات NDK API android_getnetworkblockedreason(int sockFd) لتحديد ما إذا تم حظر حزمة بيانات من خلال ميزة "حماية الشبكة المحلية" (LNP). تعرض واجهة برمجة التطبيقات هذه ANDROID_NETWORK_BLOCKED_REASON_LNP.

  • حالات الاستخدام الأخرى (مثل إنترنت الأشياء): يجب أن تستخدم التطبيقات التي تعثر على الأجهزة باستخدام نظام أسماء النطاقات المتعدد البث (mDNS) واجهة برمجة التطبيقات android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKER التي تتيح العثور على الأجهزة بدون إذن، وNsdManager#registerServiceInfoCallback / NsdManager#resolveService للحصول على عناوين IP. لا تتطلّب الاتصالات بعناوين IP التي يتم الحصول عليها بهذه الطريقة الحصول على إذن ACCESS_LOCAL_NETWORK.

بالنسبة إلى التطبيقات التي تتطلّب الاتصال المباشر بالشبكة المحلية ولا يمكنها استخدام أدوات الاختيار التي يتوسّطها النظام، فإنّ النهج المقترَح هو استخدام استراتيجية إعادة ضبط عدّاد الأذونات عند استهداف الإصدار 17 من نظام التشغيل Android (الإصدار 37 من حزمة تطوير البرامج (SDK)) أو الإصدارات الأحدث. إذا ألغى المستخدم إذن ACCESS_LOCAL_NETWORK، تتيح هذه الآلية فرصًا إضافية للتطبيق لطلب الإذن مرة أخرى، ما يسمح للمطوّرين بتقديم مبرّر أوضح للمستخدم.

إرشادات Android 16 (متوقّفة نهائيًا)

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

  1. تثبيت إصدار Android 16 Beta 3 أو إصدار أحدث على جهازك
  2. تثبيت التطبيق المطلوب اختباره
  3. تبديل إعدادات Appcompat باستخدام adb

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

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

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

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

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

الإذن طلب وارد من شبكة LAN طلب الإنترنت الصادر/الوارد طلب وارد من شبكة LAN
تم منح الأذونات Works Works Works
لم يتم منح الموافقة الإخفاقات Works الإخفاقات

استخدِم الأمر التالي لإيقاف إعدادات Appcompat

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

الأخطاء

إذا تعذّر طلب الوصول إلى الشبكة المحلية بسبب عدم توفّر الإذن اللازم:

  • ستؤدي اتصالات TCP عادةً إلى حدوث خطأ في المهلة.

  • ستؤدي أخطاء UDP وحالات رفض الأذونات العامة عادةً إلى ظهور رمز الخطأ EPERM

أخطاء

أرسِل الأخطاء والملاحظات بشأن:

  • اختلافات في الوصول إلى الشبكة المحلية (لا تعتقد أنّه يجب اعتبار وصول معيّن وصولاً إلى "الشبكة المحلية")
  • الأخطاء التي يجب فيها حظر الوصول إلى شبكة LAN ولكن لا يتم حظره
  • الأخطاء التي يتم فيها حظر الوصول إلى شبكة LAN على الرغم من عدم وجوب حظره

لن تتأثر الميزات التالية بهذا التغيير:

  • إمكانية الوصول إلى الإنترنت
  • شبكة الجوّال