首页 / 资讯中心 / 文章详情

pixel-wifi-captive-portal

pixel-wifi-captive-portal ★ FEATURED ARTICLE
Pixel 连接 WiFi 提示网络连接受限的排查与解决基于 Pixel 3(Android 12 AOSP)真机的完整排查记录一、问题现象一台运行原生 Android(AOSP)的 Pixel 3,连接家庭 WiFi(运营商光猫)后:WiFi 状态显示已连接,IP、网关、DNS 均已正常获取但系统提示“网络连接受限”,WiFi 图标出现感叹号浏览器打不开网页,大量应用提示无网络诡异的是:用 adb 测试,ping网关、ping公网 IP、域名解析全部正常。明明能上网,系统却说没网。二、排查过程1. 确认 WiFi 链路层与 DHCP 正常adb shell dumpsys wifi|grep-EWi-Fi is|mNetworkInfo|SSID|IP address输出显示:Wi-Fi is enabled mWifiInfo SSID: WiFi名称, Supplicant state: COMPLETED, RSSI: -37 baseConfiguration IP address 192.168.1.100/24 Gateway 192.168.1.1 DNS servers: [ 192.168.1.1 ]链路层认证完成(COMPLETED),DHCP 拿到 IP192.168.1.100、网关和 DNS。WiFi 连接本身没有问题。2. 查看 ConnectivityService 的网络能力标记adb shell dumpsys connectivity|grep-ENetworkAgentInfo|VALIDATED|INTERNET关键输出:NetworkAgentInfo{network{101} ... Score(60) partialConnectivity nc{[ Transports: WIFI Capabilities: NOT_METEREDINTERNET...PARTIAL_CONNECTIVITY... ]}}找到第一个关键线索:PARTIAL_CONNECTIVITY(部分连通)。这个标记的含义:Android 认为该网络能连上局域网,但无法通过互联网验证(captive portal check failed)。这就是系统显示网络连接受限、应用拒绝使用该网络的直接原因。3. 分层测试网络连通性先测本地(网关):adb shellping-c3192.168.1.1# 3 packets transmitted, 3 received, 0% packet loss ✓ 正常再测公网 IP:adb shellping-c3223.5.5.5# 3 packets transmitted, 3 received, 0% packet loss ✓ 正常再测 DNS 解析:adb shellping-c2baidu.com# PING baidu.com (111.63.65.103) ... 2 received ✓ 正常IP 层和 DNS 全部正常——互联网实际上是通的。那PARTIAL_CONNECTIVITY是怎么来的?问题只能出在 Android 的网络验证机制上。4. 检查验证服务器配置Android 从 5.0 引入 captive portal(强制门户)机制:连上 WiFi 后,系统会向一个固定 URL 发请求,期望收到 HTTP 204。收到 204 → 标记VALIDATED(可上网);收到 302/HTML → 判定存在强制门户(如酒店认证页);请求失败 → 判定无互联网,标记PARTIAL_CONNECTIVITY。原生 Android 默认访问Google 的服务器:http://connectivitycheck.gstatic.com/generate_204 https://www.google.com/generate_204查看设备配置:adb shell settings get global captive_portal_mode adb shell settings get global captive_portal_http_url adb shell settings get global captive_portal_https_url# 全部返回 null → 使用默认的 Google 服务器在国内网络环境下,Google 服务器不可达(DNS 污染指向假 IP,TLS 握手失败),验证必然失败→PARTIAL_CONNECTIVITY→ “网络连接受限”。5. 意外发现:IPv6 是第二个坑排查中注意到设备通过 SLAAC 拿到了运营商的 IPv6 地址和默认路由:inet6 2409:xxxx:xxxx:0:xxxx:xxxx:xxxx:xxxx/64 scope global temporary dynamic测试 IPv6 出口:adb shell ping6-c22400:3200::1# 阿里 DNS IPv6adb shell ping6-c2240c::6666# 2 packets transmitted, 0 received, 100% packet loss ✗ 完全不通光猫宣告了 IPv6(RA),但上游 IPv6 实际没有互联网出口。这是国内运营商网络的常见问题。后果:验证服务器域名(如connectivitycheck.gstatic.com)有 AAAA 记录,设备有 IPv6 默认路由时会优先走 IPv6 发起验证——即使 IPv4 完全正常,验证流量也会掉进不通的 IPv6 黑洞。三、根因总结WiFi 连接正常(IP/DNS/路由都有) │ ├── IPv4 互联网:正常 ├── IPv6 互联网:不通(光猫宣告 RA 但上游无出口) │ └── Android 网络验证(captive portal check) ├── 默认验证服务器:Google(gstatic.com / google.com) ├── 国内不可达 DNS 污染 AAAA 记录优先走坏的 IPv6 └── 验证失败 → PARTIAL_CONNECTIVITY → 网络连接受限两个独立问题叠加:主因:原生 Android 的验证服务器在国内不可达,导致系统误判网络状态次因:IPv6 半残(有地址无出口),加剧验证失败,也可能影响其他依赖 IPv6 的场景四、解决方案方案 1:ADB 更换验证服务器(通用,无需 root)换成国内可达的验证服务器,以下任一均可(HTTP/HTTPS 都应返回 204):服务器URL小米 MIUIconnect.rom.miui.com/generate_204V2EX 社区captive.v2ex.co/generate_204高通www.qualcomm.cn/generate_204# 设置验证服务器adb shell settings put global captive_portal_http_url http://connect.rom.miui.com/generate_204 adb shell settings put global captive_portal_https_url https://connect.rom.miui.com/generate_204# 断开重连 WiFi 触发重新验证(或开关飞行模式)adb shell svc wifi disablesleep3adb shell svc wifienable验证是否生效:adb shell dumpsys connectivity|grep-ENetworkAgentInfo|partialConnectivity# 不再出现 partialConnectivity,capabilities 中出现 VALIDATED 即成功后续方案AI生成未实测方案 2:直接关闭验证(简单粗暴)adb shell settings put global captive_portal_mode0mode取值:0不检测(直接视为可用),1默认行为。缺点:连酒店/机场等真正的强制门户 WiFi 时,系统不再自动弹出认证页面。方案 3:Root 方案(Captivemgr / Scene)已 root 的设备推荐:Captivemgr(Magisk 模块):可自定义服务器地址,开机自动应用,不怕恢复出厂Scene 工具箱:图形化配置,功能类似方案 4:自建验证服务器(开发者方案)VPS 上用 Nginx 让/generate_204返回 204:server { listen 80; listen 443 ssl; server_name portal.example.com; location /generate_204 { return 204; } }验证:curl -i http://portal.example.com/generate_204应返回HTTP/1.1 204 No Content。方案 5:改 AOSP 源码(自编译 ROM 的根治方案)settings修改在刷机/恢复出厂后会丢失。如果你自己编译 AOSP(如本文的 Pixel 3),应改 framework 默认值:frameworks/base/core/res/res/values/config.xml:stringnameconfig_captive_portal_http_urltranslatablefalsehttp://connect.rom.miui.com/generate_204/stringstringnameconfig_captive_portal_https_urltranslatablefalsehttps://connect.rom.miui.com/generate_204/string或在设备 overlay 中覆盖(推荐,不污染 framework):device/google/crosshatch/overlay/frameworks/base/core/res/res/values/config.xml编译进 ROM 后一劳永逸。这也是小米、华为等国内厂商 ROM 出厂即默认国内验证服务器的原因。IPv6 问题的处理验证服务器换掉后,网络受限提示消失,但 IPv6 不通的坑仍在。可选:路由器侧(推荐):光猫/路由器关闭 IPv6 RA 通告,设备就不会拿到 IPv6 地址和默认路由设备侧(需 root):adb shell ip -6 addr flush dev wlan0临时清除,或在 ROM 中禁用 wlan0 的 IPv6上游侧:联系运营商开通 IPv6 公网(部分地区需要运营商后台配置)五、排查方法论小结本次排查体现了一个通用思路,遇到WiFi 已连接但无法上网类问题可复用:先看系统怎么判定:dumpsys connectivity中的VALIDATED/PARTIAL_CONNECTIVITY/CAPTIVE_PORTAL标记,直接告诉你系统的结论分层测试,不要只看表象:PARTIAL_CONNECTIVITY≠ 没网。网关 → 公网 IP → DNS 逐层验证,区分真没网和系统误判理解机制才能定位根因:captive portal 验证是原生 Android 在国内水土不服的高频问题,知道默认服务器是 Google 的,方向立刻清晰注意双栈陷阱:IPv4 正常不代表 IPv6 正常,反之亦然。ping6单独测试很有必要临时方案与根治方案分开:settings put立即生效适合救急;改 overlay/源码才是自编译 ROM 的长久方案参考解决 Pixel 及 aosp rom 国内 WiFi 网络连接受限 - 看雪论坛中国游必备: 解决 Pixel 原生 Android 手机 WIFI网络连接受限问题解决 Pixel、Lineage 等原始系统中的 WIFI 网络连接受限问题自建 CaptivePortal 检测服务器Android 系统的网络检测与 Captive Portal 机制
阅读完成 · 觉得有帮助?
咨询建站