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)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 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_NETWORKyang luas. - Konektivitas Umum:
NsdManagermenyertakan 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_NETWORKdalamAndroidManifest.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_NETWORKadalah bagian dari grup izinNEARBY_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 APIandroid_getnetworkblockedreason(int sockFd)untuk menentukan apakah paket diblokir oleh LNP. API ini menampilkanANDROID_NETWORK_BLOCKED_REASON_LNP.Kasus Penggunaan Lainnya (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. 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:
- Mem-flash perangkat Anda ke build dengan Android 16 Beta 3 atau yang lebih baru
- Instal aplikasi yang akan diuji
Mengganti 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 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_DEVICESdalammanifest-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