Perubahan perilaku: Aplikasi yang menargetkan Android 16 atau yang lebih tinggi

Seperti rilis sebelumnya, Android 16 menyertakan perubahan perilaku yang mungkin memengaruhi aplikasi Anda. Perubahan perilaku berikut ini berlaku khusus bagi aplikasi yang menargetkan Android 16 atau yang lebih tinggi. Jika aplikasi Anda menargetkan Android 16 atau yang lebih tinggi, Anda harus memodifikasi aplikasi untuk mendukung perilaku ini, jika berlaku.

Pastikan Anda juga meninjau daftar perubahan perilaku yang memengaruhi semua aplikasi yang berjalan di Android 16, terlepas dari targetSdkVersion aplikasi Anda.

Pengalaman pengguna dan UI sistem

Android 16 (level API 36) menyertakan perubahan berikut yang dimaksudkan untuk menciptakan pengalaman pengguna yang lebih konsisten dan intuitif.

Penghapusan opsi tidak menggunakan layar penuh

Android 15 menerapkan tampilan layar penuh untuk aplikasi yang menargetkan Android 15 (level API 35), tetapi aplikasi Anda dapat memilih tidak menggunakan tampilan layar penuh dengan menyetel R.attr#windowOptOutEdgeToEdgeEnforcement ke true. Untuk aplikasi yang menargetkan Android 16 (level API 36), R.attr#windowOptOutEdgeToEdgeEnforcement tidak digunakan lagi dan dinonaktifkan, dan aplikasi Anda tidak dapat memilih untuk tidak menggunakan tampilan layar penuh.

  • Jika aplikasi Anda menargetkan Android 16 (level API 36) dan berjalan di perangkat Android 15, R.attr#windowOptOutEdgeToEdgeEnforcement akan terus berfungsi.
  • Jika aplikasi Anda menargetkan Android 16 (level API 36) dan berjalan di perangkat Android 16, R.attr#windowOptOutEdgeToEdgeEnforcement dinonaktifkan.

Untuk pengujian di Android 16, pastikan aplikasi Anda mendukung layar penuh dan hapus penggunaan R.attr#windowOptOutEdgeToEdgeEnforcement agar aplikasi Anda juga mendukung layar penuh di perangkat Android 15. Untuk mendukung tampilan layar penuh, lihat panduan Compose dan View.

Migrasi atau penonaktifan diperlukan untuk kembali prediktif

Untuk aplikasi yang menargetkan Android 16 (level API 36) atau yang lebih tinggi dan berjalan di perangkat Android 16 atau yang lebih tinggi, animasi sistem kembali prediktif (kembali ke layar utama, lintas tugas, dan lintas aktivitas) diaktifkan secara default. Selain itu, onBackPressed tidak dipanggil dan KeyEvent.KEYCODE_BACK tidak dikirim lagi.

Jika aplikasi Anda mencegat peristiwa kembali dan Anda belum bermigrasi ke kembali prediktif, update aplikasi Anda untuk menggunakan API navigasi kembali yang didukung, atau nonaktifkan sementara dengan menetapkan atribut android:enableOnBackInvokedCallback ke false dalam tag <application> atau <activity> pada file AndroidManifest.xml aplikasi Anda.

Animasi kembali ke layar utama prediktif.
Animasi lintas aktivitas prediktif.
Animasi lintas tugas prediktif.

API font elegan tidak digunakan lagi dan dinonaktifkan

Aplikasi yang menargetkan Android 15 (level API 35) memiliki atribut elegantTextHeight TextView yang ditetapkan ke true secara default, menggantikan font ringkas dengan font yang jauh lebih mudah dibaca. Anda dapat mengganti perilaku ini dengan menyetel atribut elegantTextHeight ke false.

Android 16 menghentikan penggunaan atribut elegantTextHeight, dan atribut akan diabaikan setelah aplikasi Anda menargetkan Android 16. "Font UI" yang dikontrol oleh API ini akan dihentikan, jadi Anda harus menyesuaikan tata letak apa pun untuk memastikan rendering teks yang konsisten dan siap untuk masa mendatang dalam bahasa Arab, Laos, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu, atau Thai.

Perilaku
elegantTextHeight untuk aplikasi yang menargetkan Android 14 (level API 34) dan yang lebih rendah, atau untuk aplikasi yang menargetkan Android 15 (level API 35) yang mengganti default dengan menyetel atribut elegantTextHeight ke false.
Perilaku
elegantTextHeight untuk aplikasi yang menargetkan Android 16 (level API 36), atau untuk aplikasi yang menargetkan Android 15 (level API 35) yang tidak mengganti default dengan menyetel atribut elegantTextHeight ke false.

Fungsi inti

Android 16 (level API 36) mencakup perubahan berikut yang mengubah atau memperluas berbagai kemampuan inti sistem Android.

Pengoptimalan penjadwalan kerja tarif tetap

Sebelum menargetkan Android 16, saat scheduleAtFixedRate melewatkan eksekusi tugas karena berada di luar siklus proses yang valid, semua eksekusi yang terlewat akan segera dijalankan saat aplikasi kembali ke siklus proses yang valid.

Saat menargetkan Android 16, maksimal satu eksekusi yang terlewat dari scheduleAtFixedRate akan langsung dieksekusi saat aplikasi kembali ke siklus proses yang valid. Perubahan perilaku ini diharapkan dapat meningkatkan performa aplikasi. Uji perilaku ini di aplikasi Anda untuk memeriksa apakah aplikasi Anda terpengaruh. Anda juga dapat menguji dengan menggunakan framework kompatibilitas aplikasi dan mengaktifkan flag kompatibilitas STPE_SKIP_MULTIPLE_MISSED_PERIODIC_TASKS.

Faktor bentuk perangkat

Android 16 (level API 36) menyertakan perubahan berikut untuk aplikasi saat ditampilkan di perangkat layar besar.

Tata letak adaptif

现在,Android 应用可在各种设备(例如手机、平板电脑、可折叠设备、桌面设备、汽车和电视)上运行,并且在大屏设备上支持多种窗口模式(例如分屏和桌面窗口),因此开发者应构建能够适应任何屏幕和窗口尺寸的 Android 应用,无论设备方向如何。在当今多设备的世界中,限制屏幕方向和尺寸可调整性等范式过于严格。

忽略屏幕方向、尺寸可调整性和宽高比限制

对于以 Android 16(API 级别 36)为目标平台的应用,屏幕方向、尺寸可调整性和宽高比限制不再适用于最小宽度 >= 600dp 的显示屏。无论宽高比或用户偏好的屏幕方向如何,应用都会填满整个显示窗口,且不会采用竖条模式。

此变更引入了新的标准平台行为。Android 正在向一种模型转变,在该模型中,应用需要适应各种屏幕方向、显示大小和宽高比。固定屏幕方向或有限的尺寸调整等限制会阻碍应用的适应性。使应用具有自适应性,以提供尽可能最佳的用户体验。

您还可以使用应用兼容性框架并启用 UNIVERSAL_RESIZABLE_BY_DEFAULT 兼容性标志来测试此行为。

常见的重大更改

忽略屏幕方向、可调整大小性和宽高比限制可能会影响应用在某些设备上的界面,尤其是那些专为锁定为纵向的小布局设计的元素,例如布局拉伸、动画和组件超出屏幕等问题。任何关于宽高比或屏幕方向的假设都可能导致应用出现视觉问题。详细了解如何避免这些问题并改进应用的自适应行为。

允许设备旋转会导致更多 activity 重新创建,如果未正确保留,可能会导致用户状态丢失。如需了解如何正确保存界面状态,请参阅保存界面状态

实现细节

在全屏模式和多窗口模式下,以下清单属性和运行时 API 会被大屏设备忽略:

系统会忽略 screenOrientationsetRequestedOrientation()getRequestedOrientation() 的以下值:

  • portrait
  • reversePortrait
  • sensorPortrait
  • userPortrait
  • landscape
  • reverseLandscape
  • sensorLandscape
  • userLandscape

对于显示屏可调整大小性,android:resizeableActivity="false"android:minAspectRatioandroid:maxAspectRatio 没有影响。

对于以 Android 16(API 级别 36)为目标平台的应用,默认情况下,大屏设备会忽略应用的屏幕方向、可调整尺寸性和宽高比限制,但尚未完全准备就绪的每个应用都可以选择停用此行为,从而暂时替换此行为(这会导致应用恢复到之前放置在兼容模式下的行为)。

异常

在以下情况下,Android 16 的屏幕方向、尺寸调整能力和宽高比限制不适用:

  • 游戏(基于 android:appCategory 标志)
  • 用户在设备的宽高比设置中明确选择启用应用的默认行为
  • 小于 sw600dp 的屏幕

暂时停用

如需选择停用特定 activity,请声明 PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY 清单属性:

<activity ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
  ...
</activity>

如果您的应用有太多部分尚未准备好支持 Android 16,您可以在应用级别应用相同的属性,从而完全选择不启用该功能:

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

Kesehatan dan kebugaran

Android 16 (level API 36) mencakup perubahan berikut terkait data kesehatan dan kebugaran.

Izin kesehatan dan kebugaran

对于以 Android 16(API 级别 36)或更高版本为目标平台的应用,BODY_SENSORS 权限使用 android.permissions.health 下更精细的权限,健康数据共享也使用这些权限。自 Android 16 起,凡是以前需要具有 BODY_SENSORSBODY_SENSORS_BACKGROUND 权限的 API,现在都需要获取相应的 android.permissions.health 权限。这会影响以下数据类型、API 和前台服务类型:

如果您的应用使用这些 API,则应请求相应的精细权限:

这些权限与用于保护对 Health Connect(Android 健康、健身和身心状态数据存储区)中读取数据的访问权限相同。

移动应用

迁移到使用 READ_HEART_RATE 和其他精细权限的移动应用还必须声明 activity 以显示应用的隐私权政策。此要求与健康数据共享的要求相同。

Konektivitas

Android 16 (level API 36) menyertakan perubahan berikut dalam stack Bluetooth untuk meningkatkan konektivitas dengan perangkat periferal.

Maksud baru untuk menangani perubahan enkripsi dan hilangnya koneksi

Sebagai bagian dari Peningkatan penanganan kehilangan ikatan, Android 16 juga memperkenalkan 2 intent baru untuk memberi aplikasi kesadaran yang lebih besar tentang kehilangan ikatan dan perubahan enkripsi.

Aplikasi yang menargetkan Android 16 kini dapat:

  • Menerima intent ACTION_KEY_MISSING saat kehilangan ikatan jarak jauh terdeteksi, sehingga memungkinkannya memberikan masukan pengguna yang lebih informatif dan mengambil tindakan yang sesuai.
  • Menerima intent ACTION_ENCRYPTION_CHANGE setiap kali status enkripsi link berubah. Hal ini mencakup perubahan status enkripsi, perubahan algoritma enkripsi, dan perubahan ukuran kunci enkripsi. Aplikasi harus mempertimbangkan pengikatan yang dipulihkan jika link berhasil dienkripsi setelah menerima intent ACTION_ENCRYPTION_CHANGE nanti.

Beradaptasi dengan berbagai implementasi OEM

Meskipun Android 16 memperkenalkan intent baru ini, penerapan dan siarannya dapat bervariasi di berbagai produsen perangkat (OEM). Untuk memastikan aplikasi Anda memberikan pengalaman yang konsisten dan andal di semua perangkat, developer harus mendesain penanganan kehilangan ikatan untuk beradaptasi dengan baik dengan potensi variasi ini.

Sebaiknya gunakan perilaku aplikasi berikut:

  • Jika intent ACTION_KEY_MISSING disiarkan:

    Link ACL (Asynchronous Connection-Less) akan terputus oleh sistem, tetapi informasi ikatan untuk perangkat akan dipertahankan (seperti yang dijelaskan di sini).

    Aplikasi Anda harus menggunakan intent ini sebagai sinyal utama untuk deteksi hilangnya ikatan dan memandu pengguna untuk mengonfirmasi bahwa perangkat jarak jauh berada dalam jangkauan sebelum memulai penghapusan perangkat atau penyambungan ulang.

    Jika perangkat terputus setelah ACTION_KEY_MISSING diterima, aplikasi Anda harus berhati-hati saat menghubungkan kembali, karena perangkat mungkin tidak lagi terikat dengan sistem.

  • Jika intent ACTION_KEY_MISSING TIDAK disiarkan:

    Link ACL akan tetap terhubung, dan informasi ikatan untuk perangkat akan dihapus oleh sistem, sama dengan perilaku di Android 15.

    Dalam skenario ini, aplikasi Anda harus melanjutkan mekanisme penanganan hilangnya obligasi yang ada seperti pada rilis Android sebelumnya, untuk mendeteksi dan mengelola peristiwa hilangnya obligasi.

Cara baru untuk menghapus koneksi bluetooth

现在,以 Android 16 为目标平台的所有应用都可以使用 CompanionDeviceManager 中的公共 API 解除蓝牙设备配对。如果配套设备作为 CDM 关联进行管理,则应用可以在关联的设备上使用新的 removeBond(int) API 触发蓝牙配对的移除。该应用可以通过监听蓝牙设备广播事件 ACTION_BOND_STATE_CHANGED 来监控配对状态变化。

Keamanan

Android 16 (level API 36) menghadirkan perubahan keamanan berikut.

Penguncian versi MediaStore

Untuk aplikasi yang menargetkan Android 16 atau yang lebih tinggi, MediaStore#getVersion() kini akan unik untuk setiap aplikasi. Hal ini menghilangkan properti identifikasi dari string versi untuk mencegah penyalahgunaan dan penggunaan untuk teknik sidik jari. Aplikasi tidak boleh membuat asumsi apa pun terkait format versi ini. Aplikasi seharusnya sudah menangani perubahan versi saat menggunakan API ini dan dalam sebagian besar kasus tidak perlu mengubah perilakunya saat ini, kecuali jika developer telah mencoba menyimpulkan informasi tambahan yang berada di luar cakupan API ini yang dimaksudkan.

Intent yang Lebih Aman

“更安全的 intent”功能是一项多阶段安全计划,旨在提高 Android 的 intent 解析机制的安全性。目标是在 intent 处理期间添加检查,并过滤不符合特定条件的 intent,从而保护应用免受恶意操作的侵害。

Android 15 中,该功能侧重于发送应用,现在在 Android 16 中,控制权转移到了接收应用,允许开发者使用其应用清单选择加入严格的 intent 解析。

我们正在实施两项关键变更:

  1. 显式 intent 必须与目标组件的 intent 过滤器相匹配:如果 intent 显式定位到某个组件,则应与该组件的 intent 过滤器相匹配。

  2. 没有操作的 intent 无法匹配任何 intent 过滤器:未指定操作的 intent 不应解析为任何 intent 过滤器。

这些变更仅在涉及多个应用时适用,不会影响单个应用内的 intent 处理。

影响

选择启用性质意味着,开发者必须在应用清单中明确启用它,才能使其生效。 因此,此功能的影响将仅限于以下应用:

  • 了解“更安全的 intent”功能及其优势。
  • 主动选择在应用中采用更严格的 intent 处理实践。

这种选择性采用的方法可最大限度地降低破坏可能依赖于当前不太安全的 intent 解析行为的现有应用的风险。

虽然在 Android 16 中,初始影响可能有限,但“更安全的 intent”计划的路线图显示,未来 Android 版本的影响范围会更广。我们计划最终将严格的意图解析设为默认行为。

“更安全的 intent”功能可让恶意应用更难利用 intent 解析机制中的漏洞,从而有望显著提升 Android 生态系统的安全性。

不过,向选择退出和强制执行的过渡必须谨慎管理,以解决现有应用的潜在兼容性问题。

实现

开发者需要在应用清单中使用 intentMatchingFlags 属性明确启用更严格的 intent 匹配。 以下示例展示了如何为整个应用选择启用该功能,但在接收器上停用/选择停用该功能:

<application android:intentMatchingFlags="enforceIntentFilter">
    <receiver android:name=".MyBroadcastReceiver" android:exported="true" android:intentMatchingFlags="none">
        <intent-filter>
            <action android:name="com.example.MY_CUSTOM_ACTION" />
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.MY_ANOTHER_CUSTOM_ACTION" />
        </intent-filter>
    </receiver>
</application>

有关支持的标志的更多信息:

标志名称 说明
enforceIntentFilter 对传入的 intent 强制执行更严格的匹配
none 停用针对传入 intent 的所有特殊匹配规则。指定多个标志时,系统会优先考虑“无”标志,以解决值冲突问题
allowNullAction 放宽了匹配规则,允许匹配没有操作的 intent。此标志与“enforceIntentFilter”结合使用可实现特定行为

测试和调试

在强制执行处于有效状态时,如果 intent 调用方已正确填充 intent,应用应能正常运行。 不过,被屏蔽的 intent 会触发警告日志消息(例如 "Intent does not match component's intent filter:""Access blocked:"),并带有标记 "PackageManager."。这表示存在可能会影响应用的潜在问题,需要引起注意。

Logcat 过滤条件:

tag=:PackageManager & (message:"Intent does not match component's intent filter:" | message: "Access blocked:")

Pemfilteran syscall GPU

Untuk memperkuat platform GPU Mali, IOCTL GPU Mali yang telah dihentikan atau ditujukan hanya untuk pengembangan GPU telah diblokir dalam build produksi. Selain itu, IOCTL yang digunakan untuk pembuatan profil GPU telah dibatasi untuk proses shell atau aplikasi yang dapat di-debug. Lihat pembaruan SAC untuk mengetahui detail selengkapnya tentang kebijakan tingkat platform.

Perubahan ini terjadi di perangkat Pixel yang menggunakan GPU Mali (Pixel 6-9). Arm telah memberikan kategorisasi resmi IOCTL mereka di Documentation/ioctl-categories.rst rilis r54p2. Daftar ini akan terus diperbarui dalam rilis driver mendatang.

Perubahan ini tidak memengaruhi API grafis yang didukung (termasuk Vulkan dan OpenGL), dan diperkirakan tidak akan memengaruhi developer atau aplikasi yang ada. Alat pembuatan profil GPU seperti Streamline Performance Analyzer dan Android GPU Inspector tidak akan terpengaruh.

Pengujian

Jika Anda melihat penolakan SELinux yang mirip dengan berikut ini, kemungkinan aplikasi Anda telah terpengaruh oleh perubahan ini:

06-30 10:47:18.617 20360 20360 W roidJUnitRunner: type=1400 audit(0.0:85): avc:  denied  { ioctl }
for  path="/dev/mali0" dev="tmpfs" ino=1188 ioctlcmd=0x8023
scontext=u:r:untrusted_app_25:s0:c512,c768 tcontext=u:object_r:gpu_device:s0 tclass=chr_file
permissive=0 app=com.google.android.selinux.pts

Jika aplikasi Anda perlu menggunakan IOCTL yang diblokir, laporkan bug dan tetapkan bug tersebut ke android-partner-security@google.com.

FAQ

  1. Apakah perubahan kebijakan ini berlaku untuk semua OEM? Perubahan ini bersifat keikutsertaan, tetapi tersedia untuk OEM mana pun yang ingin menggunakan metode penguatan ini. Petunjuk untuk menerapkan perubahan dapat ditemukan dalam dokumentasi penerapan.

  2. Apakah perubahan pada codebase OEM wajib dilakukan untuk menerapkan fitur ini, atau apakah fitur ini disertakan secara default dalam rilis AOSP baru? Perubahan tingkat platform akan hadir dengan rilis AOSP baru secara default. Vendor dapat memilih untuk menerapkan perubahan ini di codebase mereka jika ingin menerapkannya.

  3. Apakah SoC bertanggung jawab untuk memperbarui daftar IOCTL? Misalnya, jika perangkat saya menggunakan GPU ARM Mali, apakah saya perlu menghubungi ARM untuk mengetahui perubahan apa pun? SoC individual harus memperbarui daftar IOCTL per perangkat saat rilis driver. Misalnya, ARM akan memperbarui daftar IOCTL yang dipublikasikan saat ada update driver. Namun, OEM harus memastikan bahwa mereka menyertakan pembaruan dalam SEPolicy mereka, dan menambahkan IOCTL kustom yang dipilih ke daftar sesuai kebutuhan.

  4. Apakah perubahan ini diterapkan secara otomatis ke semua perangkat Pixel yang tersedia di pasar, atau apakah tindakan pengguna diperlukan untuk mengaktifkan sesuatu agar perubahan ini diterapkan? Perubahan ini berlaku untuk semua perangkat Pixel yang tersedia di pasar yang menggunakan GPU Mali (Pixel 6-9). Pengguna tidak perlu melakukan tindakan apa pun untuk menerapkan perubahan ini.

  5. Apakah penggunaan kebijakan ini akan memengaruhi performa driver kernel? Kebijakan ini diuji di GPU Mali menggunakan GFXBench, dan tidak ada perubahan yang terukur pada performa GPU.

  6. Apakah daftar IOCTL harus sesuai dengan versi driver kernel dan ruang pengguna saat ini? Ya, daftar IOCTL yang diizinkan harus disinkronkan dengan IOCTL yang didukung oleh driver ruang pengguna dan kernel. Jika IOCTL di ruang pengguna atau driver kernel diperbarui, daftar IOCTL SEPolicy harus diperbarui agar cocok.

  7. ARM telah mengategorikan IOCTL sebagai 'dibatasi' / 'instrumentasi', tetapi kami ingin menggunakan beberapa di antaranya dalam kasus penggunaan produksi, dan/atau menolak yang lain. OEM/SoC masing-masing bertanggung jawab untuk memutuskan cara mengategorikan IOCTL yang mereka gunakan, berdasarkan konfigurasi library Mali ruang penggunanya. Daftar ARM dapat digunakan untuk membantu memutuskan hal ini, tetapi setiap kasus penggunaan OEM/SoC mungkin berbeda.

Privasi

Android 16 (level API 36) menyertakan perubahan privasi berikut.

Izin Jaringan Lokal

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

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

Rencana rilis

Perubahan ini akan di-deploy antara dua rilis, 25Q2 dan 26Q2. Developer harus mengikuti panduan ini untuk 25Q2 dan memberikan masukan karena perlindungan ini akan diterapkan pada rilis Android mendatang. Selain itu, mereka harus memperbarui skenario yang bergantung pada akses jaringan lokal implisit dengan menggunakan panduan berikut dan bersiap menghadapi penolakan dan pencabutan izin baru oleh pengguna.

Dampak

Pada tahap saat ini, LNP adalah fitur keikutsertaan yang berarti hanya aplikasi yang memilih untuk menggunakan fitur ini yang akan terpengaruh. Tujuan fase keikutsertaan adalah agar developer aplikasi memahami bagian aplikasi mereka yang bergantung pada akses jaringan lokal implisit sehingga mereka dapat bersiap untuk mengamankan izinnya untuk rilis berikutnya.

Aplikasi akan terpengaruh jika mengakses jaringan lokal pengguna menggunakan:

  • Penggunaan soket mentah secara langsung atau library pada alamat jaringan lokal (misalnya, protokol penemuan layanan mDNS atau SSDP)
  • Penggunaan class tingkat framework yang mengakses jaringan lokal (misalnya, NsdManager)

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 dalam kode native atau terkelola, library jaringan seperti Cronet dan OkHttp, serta API apa pun yang diimplementasikan di atasnya. Mencoba menyelesaikan layanan di jaringan lokal (yaitu yang memiliki sufiks .local) akan memerlukan izin jaringan lokal.

Pengecualian untuk aturan di atas:

  • Jika server DNS perangkat berada di jaringan lokal, traffic ke atau dari server 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 lebih lanjut akan tersedia pada Kuartal 4 2025).

Panduan Developer (Keikutsertaan)

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

  1. Lakukan flash perangkat ke build dengan 25Q2 Beta 3 atau yang lebih baru.
  2. Instal aplikasi yang akan diuji.
  3. Mengaktifkan/menonaktifkan flag Appcompat di 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 akan terpengaruh selama fase keikutsertaan.

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

  1. Pastikan aplikasi mendeklarasikan izin NEARBY_WIFI_DEVICES dalam manifesnya.
  2. 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.

Setelah penegakan perlindungan jaringan lokal dimulai, berikut dampak yang akan dialami 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 flag App-Compat

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Error

Error yang timbul dari batasan ini akan dikembalikan ke soket panggilan setiap kali soket memanggil send atau varian send ke alamat jaringan lokal.

Contoh error:

sendto failed: EPERM (Operation not permitted)

sendto failed: ECONNABORTED (Operation not permitted)

Definisi Jaringan Lokal

Jaringan lokal dalam project ini mengacu pada jaringan IP yang menggunakan antarmuka jaringan yang mendukung siaran, seperti Wi-Fi atau Ethernet, tetapi tidak termasuk koneksi seluler (WWAN) atau VPN.

Berikut ini dianggap sebagai jaringan lokal:

IPv4:

  • 169.254.0.0/16 // Link Lokal
  • 100.64.0.0/10 // CGNAT
  • 10.0.0.0/8 // RFC1918
  • 172.16.0.0/12 // RFC1918
  • 192.168.0.0/16 // RFC1918

IPv6:

  • Link-local
  • Rute yang terhubung langsung
  • Jaringan stub seperti Thread
  • Beberapa subnet (TBD)

Selain itu, alamat multicast (224.0.0.0/4, ff00::/8) dan alamat siaran IPv4 (255.255.255.255) diklasifikasikan sebagai alamat jaringan lokal.

Foto milik aplikasi

Saat diminta untuk memberikan izin foto dan video oleh aplikasi yang menargetkan SDK 36 atau yang lebih tinggi di perangkat yang menjalankan Android 16 atau yang lebih tinggi, pengguna yang memilih untuk membatasi akses ke media yang dipilih akan melihat foto apa pun yang dimiliki oleh aplikasi yang telah dipilih sebelumnya di pemilih foto. Pengguna dapat membatalkan pilihan salah satu item yang telah dipilih sebelumnya, yang akan mencabut akses aplikasi ke foto dan video tersebut.