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)atauSimple 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:
- Streaming Media: Untuk aplikasi yang mendukung Google Cast, aplikasi tersebut dapat menggunakan
fitur output switcher. Hal ini memungkinkan developer mengizinkan pengguna memilih perangkat streaming tertentu tanpa aplikasi perlu meminta izin yang luas.
ACCESS_LOCAL_NETWORK - Konektivitas Umum:
NsdManagermenyertakan pemilih layanan yang dijalankan sistem untuk penemuan mDNS. Daripada aplikasi memindai seluruh jaringan, sistem akan menampilkan dialog yang memungkinkan pengguna memilih satu perangkat untuk diakses 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.
Deklarasikan izin dalam manifes: Deklarasikan
ACCESS_LOCAL_NETWORKsecara eksplisit diAndroidManifest.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_NETWORKadalah bagian dari grup izinNEARBY_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 APIandroid_getnetworkblockedreason(int sockFd)untuk menentukan apakah paket diblokir oleh LNP. API ini menampilkanANDROID_NETWORK_BLOCKED_REASON_LNP.Kasus Penggunaan Lain (misalnya, IoT): Aplikasi yang menemukan perangkat menggunakan mDNS harus menggunakan
android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKERyang memungkinkan menemukan perangkat tanpa izin, danNsdManager#registerServiceInfoCallback/NsdManager#resolveServiceuntuk mendapatkan alamat IP. Koneksi ke alamat IP yang diperoleh dengan cara ini tidak memerlukan izinACCESS_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:
- Flash perangkat Anda ke build dengan Android 16 Beta 3 atau yang lebih baru
- Instal aplikasi yang akan diuji
Beralih konfigurasi Appcompat menggunakan adb
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>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_DEVICESdalammanifest. - 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