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.

Project Perlindungan Jaringan Lokal bertujuan melindungi privasi pengguna dengan membatasi akses ke jaringan lokal menggunakan izin runtime baru.

Dampak

Selama Android 16, izin ini adalah fitur keikutsertaan yang berarti hanya aplikasi yang memilih untuk menggunakan fitur ini 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 akses tersebut dengan izin pada rilis Android mendatang.

Aplikasi akan terpengaruh jika mengakses jaringan lokal pengguna menggunakan:

  • Penggunaan soket mentah secara langsung atau melalui library pada 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 unicast, multicast, siaran UDP ya
Menerima unicast, multicast, siaran UDP masuk ya

Pembatasan ini diterapkan jauh di dalam stack jaringan, sehingga berlaku untuk semua API jaringan. Hal ini mencakup soket yang dibuat di 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 sufiks .local memerlukan izin jaringan lokal.

Pengecualian untuk aturan sebelumnya:

  • Jika server DNS perangkat berada di jaringan lokal, traffic ke / dari perangkat tersebut (di port 53) tidak memerlukan izin akses jaringan lokal.
  • Aplikasi yang menggunakan Pengalih Output sebagai pemilih dalam aplikasi tidak memerlukan izin jaringan lokal (panduan selengkapnya akan tersedia 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 lebih tinggi
Izin Menggunakan NEARBY_WIFI_DEVICES untuk sementara ACCESS_LOCAL_NETWORK
Akses Default Akses jaringan lokal terbuka Jaringan lokal diblokir secara default untuk semua aplikasi yang mengupdate SDK targetnya
Grup Izin Bagian dari grup izin NEARBY_DEVICES yang ada

Untuk memverifikasi bahwa fungsi aplikasi tidak terganggu setelah penegakan, aplikasi yang menargetkan SDK 37 atau yang lebih tinggi harus menerapkan 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 sepenuhnya. Gunakan pemilih berikut berdasarkan kasus penggunaan Anda:

  • Streaming Media: Untuk aplikasi yang mendukung Google Cast, aplikasi tersebut dapat menggunakan fitur pengalih output. Hal ini memungkinkan developer mengizinkan pengguna memilih perangkat streaming tertentu tanpa aplikasi perlu meminta izin ACCESS_LOCAL_NETWORK yang luas.
  • Konektivitas Umum: NsdManager menyertakan pemilih layanan yang dijalankan sistem untuk penemuan mDNS. Daripada memindai seluruh jaringan, sistem menampilkan dialog yang memungkinkan pengguna memilih satu perangkat yang akan diakses oleh aplikasi.
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.

  • Mendeklarasikan Izin dalam Manifes: Developer harus secara eksplisit mendeklarasikan ACCESS_LOCAL_NETWORK dalam AndroidManifest.xml.

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

  • Skenario yang izinnya diberikan sebelumnya: 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 ulang untuk akses jaringan lokal.

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

Strategi penghitung ulang permintaan izin

Platform ini menerapkan strategi reset penghitung yang menangani skenario saat penolakan sebelumnya terhadap grup izin NEARBY_DEVICES (yang kini mencakup ACCESS_LOCAL_NETWORK) mencegah aplikasi meminta izin setelah memaparkan alasannya secara memadai. Mekanisme ini memberikan peluang tambahan bagi aplikasi untuk memanggil API requestPermission(), 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 Tingkat SDK target Perilaku akses jaringan lokal Tindakan developer yang diperlukan
Aplikasi Baru / Aplikasi yang Diperbarui >= 37 (Android 17) Diblokir Secara Default Mendeklarasikan dan meminta izin runtime ACCESS_LOCAL_NETWORK
Aplikasi Lama < 37 Aplikasi dengan izin INTERNET menerima pemberian izin implisit untuk ACCESS_LOCAL_NETWORK, sehingga aplikasi tersebut dapat mempertahankan akses. Hal ini bersifat sementara dan akan diblokir secara default setelah aplikasi menaikkan SDK target ke 37 Tidak ada perubahan kode yang diperlukan saat ini

Strategi LNP berdasarkan Kasus Penggunaan

  • Transmisi: Untuk fungsi transmisi media, strategi yang paling tepat dan menjaga privasi adalah menggunakan pengalih output. 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 Lainnya (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. Jika izin ACCESS_LOCAL_NETWORK dicabut oleh pengguna, mekanisme ini memberikan peluang tambahan bagi aplikasi untuk meminta ulang izin, sehingga memungkinkan developer memberikan alasan yang lebih jelas kepada pengguna.

Panduan Android 16

Untuk mengaktifkan pembatasan jaringan lokal, lakukan langkah-langkah berikut:

  1. Mem-flash perangkat Anda ke build dengan Android 16 Beta 3 atau yang lebih baru
  2. Instal aplikasi yang akan diuji
  3. Mengganti 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 Anda (misalnya, NsdManager), API tersebut tidak terpengaruh selama keikutsertaan.

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

  • Pastikan aplikasi mendeklarasikan izin NEARBY_WIFI_DEVICES dalam manifest-nya.
  • 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 mengikutsertakan aplikasi. Berikut pengaruh traffic jaringan aplikasi.

Izin Permintaan LAN Keluar Permintaan Internet Keluar/Masuk Permintaan LAN Masuk
Diberikan Works Works Works
Tidak Diberikan Gagal Works 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

Kirim 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 diblokir
  • Bug yang menyebabkan akses LAN diblokir padahal seharusnya tidak

Hal-hal berikut tidak akan terpengaruh oleh perubahan ini:

  • Akses ke Internet
  • Jaringan Seluler