具有 INTERNET
权限的任何应用都可以访问 LAN 上的设备。这样一来,应用便可轻松连接到本地设备,但也带来了隐私权影响,例如形成用户的指纹和充当位置信息代理。
本地网络保护项目旨在通过将对本地网络的访问权限置于新的运行时权限后面来保护用户的隐私。
影响
在 Android 16 中,此权限是一项用户选择启用的功能,这意味着只有选择启用的应用会受到影响。这项功能的目的是让应用开发者了解其应用的哪些部分依赖于隐式本地网络访问权限,以便他们为在未来的 Android 版本中为这些部分设置权限保护做好准备。
如果应用使用以下方式访问用户的本地网络,则会受到影响:
- 在本地网络地址上直接或通过库使用原始套接字(例如 mDNS 或 SSDP 服务发现协议)
- 使用访问本地网络的框架级类(例如 NsdManager)
影响详情
传入和传出本地网络地址的流量需要本地网络访问权限。下表列出了一些常见用例:
应用低级网络操作 | 需要本地网络权限 |
---|---|
建立出站 TCP 连接 | 是 |
接受传入的 TCP 连接 | 是 |
发送 UDP 单播、多播、广播 | 是 |
接收传入的 UDP 单播、多播、广播 | 是 |
这些限制在网络堆栈深处实现,因此适用于所有网络 API。这包括在平台或受管理代码中创建的套接字、Cronet 和 OkHttp 等网络库,以及在这些库之上实现的任何 API。尝试解析本地网络上的服务(即带有 .local 后缀的服务)需要本地网络权限。
上述规则的例外情况:
- 如果设备的 DNS 服务器位于本地网络中,则往返于该服务器的流量(在端口 53 上)不需要本地网络访问权限。
- 使用输出切换器作为应用内选择器的应用无需本地网络权限(后续版本中将提供更多指南)。
指南
如需选择启用本地网络限制,请执行以下操作:
- 将设备刷写到搭载 Android 16 Beta 版 3 或更高版本的 build
- 安装要测试的应用
使用 adb 切换 Appcompat 配置
adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
重新启动设备
现在,您的应用对本地网络的访问权限受到限制,任何尝试访问本地网络的操作都会导致套接字错误。如果您使用的是可在应用进程之外执行本地网络操作的 API(例如 NsdManager),则在用户选择启用该功能期间,这些 API 不会受到影响。
如需恢复访问权限,您必须向应用授予 NEARBY_WIFI_DEVICES
权限。
- 确保应用在其清单中声明了
NEARBY_WIFI_DEVICES
权限。 - 依次前往“设置”>“应用”> [应用名称] >“权限”>“附近的设备”>“允许”
现在,您的应用对本地网络的访问权限应该已恢复,并且所有场景都应像在应用选择启用之前一样正常运行。应用网络流量将受到以下影响。
权限 | 出站 LAN 请求 | 出站/入站互联网请求 | 入站 LAN 请求 |
---|---|---|---|
已授予 | Works | Works | Works |
未授予 | 最差排行榜 | Works | 最差排行榜 |
使用以下命令关闭 Appcompat 配置
adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>
错误
每当调用套接字调用 send
或将 send
变体用于本地网络地址时,系统都会将因这些限制而产生的错误返回给调用套接字。
错误示例:
sendto failed: EPERM (Operation not permitted)
sendto failed: ECONNABORTED (Operation not permitted)
错误
针对以下产品提交 bug 和反馈:
- LAN 访问权限差异(您认为某项访问不应被视为“本地网络”访问)
- 修复了应阻止但未阻止 LAN 访问的问题
- 修复了 LAN 访问不应被屏蔽但被屏蔽的问题
以下内容应该不会受到此次变更的影响:
- 互联网连接
- 移动网络