小米 17 Pro 升级 HyperOS 4.0 后 Chrome 访问内网闪退

记录小米 17 Pro 升级 HyperOS 4.0 后,Chrome 访问内网地址闪退的问题现象、ADB 修复方式和 ACCESS_LOCAL_NETWORK 权限原理。

现象

小米 17 Pro 升级到 HyperOS 4.0 / Android 17 后,Chrome 访问内网地址会直接闪退,例如:

  • 打开 http://192.168.10.1/ 路由器后台时,Chrome 直接退出。
  • 访问内网 IP 或内网域名时,Chrome 同样闪退。
  • MT 管理器连接 NAS SMB 超时。
  • 同一台手机访问公网正常。
  • 同一局域网内其他设备访问路由器和 NAS 正常。
  • 小米浏览器访问同样的内网地址正常。

当时的设备和系统版本:

1
2
3
4
设备:Xiaomi 17 Pro
型号:25098PN5AC
系统:HyperOS 4.0 / Android 17
构建:OS4.0.0.27.XBLCNXM

这个现象看起来像网络问题,但关键差异是:小米浏览器正常,Chrome 和 MT 管理器异常。说明底层网络大概率是通的,问题更可能出在应用权限层。

解决办法

用 ADB 查看 Chrome、MT 管理器和小米浏览器的本地网络权限:

1
2
3
adb shell 'cmd appops get --user 0 com.android.chrome ACCESS_LOCAL_NETWORK'
adb shell 'cmd appops get --user 0 bin.mt.plus ACCESS_LOCAL_NETWORK'
adb shell 'cmd appops get --user 0 com.android.browser ACCESS_LOCAL_NETWORK'

异常状态类似这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Chrome:
Uid mode: ACCESS_LOCAL_NETWORK: ignore
ACCESS_LOCAL_NETWORK: allow; rejectTime=...

MT 管理器:
Uid mode: ACCESS_LOCAL_NETWORK: ignore
ACCESS_LOCAL_NETWORK: allow; rejectTime=...

小米浏览器:
ACCESS_LOCAL_NETWORK: allow; time=...

Chrome 和 MT 管理器的包级权限是 allow,但 UID 级 AppOps 仍然是 ignore。这会导致系统设置里看起来像是已允许,应用实际访问内网时仍然被拦。

直接把受影响应用的 UID 级本地网络权限改回 allow

1
2
adb shell cmd appops set --uid com.android.chrome ACCESS_LOCAL_NETWORK allow
adb shell cmd appops set --uid bin.mt.plus ACCESS_LOCAL_NETWORK allow

如果使用无线调试,可以先配对手机:

1
2
adb pair <phone-ip>:<pair-port>
adb devices -l

修复后再次打开 Chrome 访问 http://192.168.10.1/,路由器后台可以正常打开;MT 管理器访问 NAS SMB 也恢复正常。

问题原理

Android 17 开始,本地网络保护对 target SDK 37 及以上应用强制执行。应用访问局域网地址、mDNS、SSDP、NsdManager 等本地网络能力时,会受到 ACCESS_LOCAL_NETWORK 影响。

这次问题的核心不是 Chrome 没有权限,而是权限状态分裂:

  • 包级 AppOps:ACCESS_LOCAL_NETWORK = allow
  • UID 级 AppOps:ACCESS_LOCAL_NETWORK = ignore

系统更新后,部分 App 的 UID 级 AppOps 状态没有正确迁移。于是就出现了“设置界面看起来允许,但应用实际访问内网失败”的情况。

小米浏览器没有这个 UID 级 ignore 状态,所以同一网络下可以正常访问内网;Chrome 和 MT 管理器被 UID 级 AppOps 拦住,所以分别表现为闪退和 SMB 超时。

Chrome 的闪退不是普通的 DNS 失败或 TCP 超时。崩溃日志里能看到它崩在自己的 NetworkService 线程和 libchrome.so

1
2
3
4
Fatal signal 5 (SIGTRAP), code 1 (TRAP_BRKPT)
name: NetworkService  >>> com.android.chrome <<<
backtrace:
  /data/app/.../com.android.chrome.../base.apk!libchrome.so

也就是说,系统权限异常触发了 Chrome 网络服务侧的崩溃。

注意事项

  • 只对确实需要访问内网的 App 执行 ACCESS_LOCAL_NETWORK allow,不要批量放开所有应用。
  • 如果其他应用也出现类似问题,把包名替换成对应 App 后重复检查和修复即可。
  • 包名可以用 adb shell pm list packages | grep -i <keyword> 查询。
  • 系统或应用后续更新可能再次改变 AppOps 状态,复发时重新检查 UID 级权限。

参考: