Izin jaringan lokal

Perangkat di Jaringan Area Lokal (LAN) dapat diakses oleh aplikasi apa pun yang memiliki izin INTERNET. Hal ini memudahkan aplikasi untuk terhubung ke perangkat lokal, tetapi juga menimbulkan implikasi privasi seperti membentuk sidik jari pengguna dan menjadi proxy untuk lokasi.

Proyek Perlindungan Jaringan Lokal bertujuan untuk melindungi privasi pengguna dengan membatasi akses ke jaringan lokal di balik izin runtime baru.

Dampak

Selama Android 16, izin ini adalah fitur keikutsertaan yang berarti hanya aplikasi yang ikut serta yang akan terpengaruh. Tujuan keikutsertaan ini adalah agar developer aplikasi memahami bagian aplikasi mereka yang bergantung pada akses jaringan lokal implisit sehingga mereka dapat bersiap untuk melindungi izin tersebut pada rilis Android mendatang.

Aplikasi akan terpengaruh jika mengakses jaringan lokal pengguna menggunakan:

  • Penggunaan langsung atau library soket mentah di alamat jaringan lokal, misalnya, Multicast DNS (mDNS) atau Simple Service Discovery Protocol (SSDP).
  • Penggunaan class tingkat framework yang mengakses jaringan lokal, misalnya, NsdManager.

Detail dampak

Traffic ke dan dari alamat jaringan lokal memerlukan izin akses jaringan lokal. Tabel berikut mencantumkan beberapa kasus umum:

Operasi Jaringan Tingkat Rendah Aplikasi Izin Jaringan Lokal Diperlukan
Membuat koneksi TCP keluar ya
Menerima koneksi TCP masuk ya
Mengirim siaran unicast, multicast, UDP ya
Menerima siaran unicast, multicast, UDP masuk ya

Pembatasan ini diterapkan jauh di dalam tumpukan jaringan, sehingga berlaku untuk semua API jaringan. Hal ini mencakup soket yang dibuat dalam platform atau kode terkelola, library jaringan seperti Cronet dan OkHttp, serta API apa pun yang diterapkan di atasnya. Mencoba menyelesaikan layanan di jaringan lokal yang memiliki akhiran .local memerlukan izin jaringan lokal.

Pengecualian untuk aturan sebelumnya:

  • Jika server DNS perangkat berada di jaringan lokal, traffic ke / dari server tersebut (di port 53) tidak memerlukan izin akses jaringan lokal.
  • Aplikasi yang menggunakan Output Switcher sebagai pemilih dalam aplikasi tidak memerlukan izin jaringan lokal (panduan selengkapnya akan diberikan pada rilis mendatang).

Penerapan Android 17

Mulai Android 17, perlindungan jaringan lokal bersifat wajib dan diterapkan untuk aplikasi yang menargetkan Android 17 atau yang lebih tinggi.

Aspek Android 16 Android 17
SDK Target 36 37 atau yang lebih tinggi
Izin NEARBY_WIFI_DEVICES yang digunakan untuk sementara ACCESS_LOCAL_NETWORK
Akses Default Akses jaringan lokal terbuka Jaringan lokal diblokir secara default untuk semua aplikasi yang mengupdate SDK target
Grup Izin Bagian dari grup izin NEARBY_DEVICES yang ada

Untuk memverifikasi bahwa fungsi aplikasi tidak rusak setelah penerapan, aplikasi yang menargetkan SDK 37 atau yang lebih tinggi harus menggunakan salah satu jalur berikut untuk mengelola akses jaringan lokal:

Jalur A: Menggunakan pemilih yang menjaga privasi

Untuk tugas penemuan dan koneksi yang dimediasi sistem, gunakan pemilih untuk menghindari permintaan izin runtime yang luas. Gunakan pemilih berikut berdasarkan kasus penggunaan Anda:

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
    }
})

Jalur B: Meminta izin runtime (akses luas)

Jalur ini diperlukan untuk kasus penggunaan yang kompleks seperti otomatisasi rumah atau pengelolaan perangkat IoT yang memerlukan akses luas dan persisten ke jaringan lokal.

  • Deklarasikan izin dalam manifes: Deklarasikan ACCESS_LOCAL_NETWORK secara eksplisit di AndroidManifest.xml.

  • Meminta Izin saat Runtime: Sebelum mencoba akses jaringan lokal, aplikasi harus memeriksa apakah izin telah diberikan. Jika tidak, aplikasi harus memanggil Activity.requestPermission() untuk memicu perintah sistem standar.

  • Skenario yang telah diberikan izin: Izin ACCESS_LOCAL_NETWORK adalah bagian dari grup izin NEARBY_DEVICES. Jika pengguna telah memberikan izin lain dalam grup ini (seperti izin Bluetooth), mereka tidak akan diminta lagi untuk akses jaringan lokal.

  • Menangani Penolakan dan Pencabutan: Aplikasi harus dapat menangani dengan baik kasus saat pengguna menolak permintaan atau mencabut izin di setelan sistem. Dalam skenario seperti itu, traffic jaringan lokal akan diblokir.

Strategi penghitung reset permintaan izin

Platform ini menerapkan strategi penghitung reset yang menangani skenario saat penolakan sebelumnya oleh aplikasi terhadap grup izin NEARBY_DEVICES (yang kini mencakup ACCESS_LOCAL_NETWORK) mencegah aplikasi meminta izin setelah menyajikan alasan yang memadai. Mekanisme ini memberikan peluang tambahan bagi aplikasi untuk memanggil requestPermission() API, yang secara efektif mereset jumlah penolakan untuk izin ACCESS_LOCAL_NETWORK. Hal ini memungkinkan keterlibatan ulang yang lebih bernuansa dengan pengguna, terutama saat penolakan awal terjadi sebelum aplikasi dapat menyampaikan kebutuhan akses jaringan lokal untuk fungsi intinya.

Model izin terpisah

Izin Jaringan Lokal menggunakan strategi migrasi izin terpisah untuk menangani aplikasi baru dan lama secara berbeda, berdasarkan SDK targetnya

Kategori Level SDK target Perilaku akses jaringan lokal Tindakan developer yang diperlukan
Aplikasi Baru / Aplikasi yang Diupdate >= 37 (Android 17) Diblokir Secara Default Deklarasikan dan minta izin runtime ACCESS_LOCAL_NETWORK
Aplikasi Lama < 37 Aplikasi dengan izin INTERNET menerima pemberian izin implisit untuk ACCESS_LOCAL_NETWORK, sehingga memungkinkan aplikasi tersebut mempertahankan akses. Hal ini bersifat sementara dan akan diblokir secara default setelah aplikasi meningkatkan SDK target ke 37 Tidak ada perubahan kode langsung yang diperlukan. Jangan meminta ACCESS_LOCAL_NETWORK saat runtime sebelum menargetkan SDK 37.

Strategi LNP berdasarkan Kasus Penggunaan

  • Transmisi: Untuk fungsi transmisi media, strategi yang paling tepat dan menjaga privasi adalah menggunakan output switcher. Metode ini memungkinkan sistem menangani penemuan dan koneksi jaringan lokal atas nama pengguna, sehingga aplikasi tidak perlu meminta izin ACCESS_LOCAL_NETWORK.

  • Browser: Penanganan error memerlukan pendekatan yang berbeda berdasarkan protokol. Error UDP menghasilkan kode error EPERM. Untuk koneksi TCP, browser harus menggunakan NDK API android_getnetworkblockedreason(int sockFd) untuk menentukan apakah paket diblokir oleh LNP. API ini menampilkan ANDROID_NETWORK_BLOCKED_REASON_LNP.

  • Kasus Penggunaan Lain (misalnya, IoT): Aplikasi yang menemukan perangkat menggunakan mDNS harus menggunakan android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKER yang memungkinkan menemukan perangkat tanpa izin, dan NsdManager#registerServiceInfoCallback / NsdManager#resolveService untuk mendapatkan alamat IP. Koneksi ke alamat IP yang diperoleh dengan cara ini tidak memerlukan izin ACCESS_LOCAL_NETWORK.

Untuk aplikasi yang memerlukan komunikasi jaringan lokal langsung dan tidak dapat menggunakan pemilih yang dimediasi sistem, pendekatan yang disarankan adalah menggunakan strategi penghitung reset izin saat menargetkan Android 17 (SDK 37) atau yang lebih tinggi. Jika izin ACCESS_LOCAL_NETWORK dicabut oleh pengguna, mekanisme ini memberikan peluang tambahan bagi aplikasi untuk meminta kembali izin tersebut, sehingga developer dapat menyajikan alasan yang lebih jelas kepada pengguna.

Panduan Android 16

Untuk ikut serta dalam pembatasan jaringan lokal, lakukan hal berikut:

  1. Flash perangkat Anda ke build dengan Android 16 Beta 3 atau yang lebih baru
  2. Instal aplikasi yang akan diuji
  3. Beralih konfigurasi Appcompat menggunakan adb

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Mulai ulang perangkat

Sekarang, akses aplikasi Anda ke jaringan lokal dibatasi dan setiap upaya untuk mengakses jaringan lokal akan menyebabkan error soket. Jika Anda menggunakan API yang melakukan operasi jaringan lokal di luar proses aplikasi (misalnya, NsdManager), API tersebut tidak akan terpengaruh selama keikutsertaan.

Untuk memulihkan akses, Anda harus memberikan izin aplikasi ke NEARBY_WIFI_DEVICES.

  • Pastikan aplikasi mendeklarasikan izin NEARBY_WIFI_DEVICES dalam manifest.
  • Buka Setelan > Aplikasi > [Nama Aplikasi] > Izin > Perangkat di sekitar > Izinkan

Sekarang, akses aplikasi Anda ke jaringan lokal akan dipulihkan dan semua skenario Anda akan berfungsi seperti sebelum aplikasi ikut serta. Berikut adalah dampak traffic jaringan aplikasi.

Izin Permintaan LAN Keluar Permintaan Internet Keluar/Masuk Permintaan LAN Masuk
Diberikan Berfungsi Berfungsi Berfungsi
Tidak Diberikan Gagal Berfungsi Gagal

Gunakan perintah berikut untuk menonaktifkan konfigurasi Appcompat

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Error

Jika permintaan akses jaringan lokal gagal karena izin tidak ada:

  • Koneksi TCP biasanya akan menghasilkan error waktu tunggu.

  • Error UDP dan penolakan izin umum biasanya akan menghasilkan kode error EPERM

Bug

Kirimkan bug dan masukan untuk:

  • Perbedaan dalam akses LAN (Anda tidak menganggap akses tertentu sebagai akses "jaringan lokal")
  • Bug saat akses LAN seharusnya diblokir, tetapi tidak
  • Bug saat akses LAN seharusnya tidak diblokir, tetapi diblokir

Hal berikut tidak akan terpengaruh oleh perubahan ini:

  • Akses ke Internet
  • Jaringan Seluler