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