1. 真机无线测试为什么总卡在“连不上”这一步
真机无线测试这件事,听起来只是把 APK 装到手机上点一下登录,但真正做过 Android APK 局域网调试的人都知道,十次失败里有八次不是代码写错了,而是手机和电脑根本没在一条能互通的链路上。你打开 Android Studio 打包出 APK,装到手机上,输入账号密码,结果弹出一句Failed to connect to /10.27.239.87:8080,这时候很多人第一反应是去翻后端日志,其实后端可能压根没收到请求。
我先把这篇要解决的问题说清楚:你要在本地跑一个后端服务,把 Android APK 装到真机上,让手机通过局域网访问电脑上的服务完成登录或接口联调,同时把调试请求统一走 TaoToken 的 Key/API 通道转发,避免每个项目到处散落不同的 Key 和 Base URL。适合谁看?适合正在做移动端真机联调、被校园网隔离或热点地址搞晕、想让调试链路更可控的 Android 开发和测试同学。
核心检索词先摆出来:真机无线测试、Android APK、局域网、ipconfig、端口。这五个词基本覆盖了整条链路的每个环节。真机无线测试的本质是“手机和电脑在同一网段 + 正确 IP + 正确端口 + 服务正在运行”,缺一个都不行。而 TaoToken 在这里的角色,是帮你把调试请求的出口统一成一个可管理的通道,Base URL 和 Key 集中配置,换项目、换模型、换环境时不用满仓库改地址。
下面我会按真实操作顺序走一遍:先定位本机局域网 IP,确认端口占用,再配 TaoToken 的 Base URL 和 Key,然后验证端口连通性,最后用真机抓包确认请求到底命中了哪里。每一步都给可复制的命令和配置片段,你照着做就能复现。
2. 用 ipconfig 定位局域网 IP 并确认端口占用
2.1 ipconfig 到底给你什么,不给你什么
很多人第一次做真机无线测试会误以为ipconfig能查到端口,这是个典型误区。ipconfig只负责告诉你本机网卡当前分配到的 IPv4 地址,端口来自后端服务的启动参数或配置文件,两者是分开的。连接地址永远是http://<IPv4>:<port>这个组合,IP 靠 ipconfig,port 靠后端确认。
在 Windows 上打开 CMD 或 PowerShell,执行:
ipconfig你会看到多个网卡段落,重点找你当前实际联网的那块。如果你用的是手机热点,通常看“无线局域网适配器 WLAN”或“无线局域网适配器 本地连接*”下面的 IPv4 地址,常见的是172.20.10.x这种网段。如果你连的是家里路由器,可能是192.168.1.x或192.168.0.x。校园网环境下经常是10.x.x.x,而这种网段往往带客户端隔离,手机和电脑虽然都“联网”了,但互相 ping 不通。
我实测下来,最稳的做法是:手机开热点,电脑连这个热点,然后在电脑上执行 ipconfig,拿到热点网段下的 IPv4。这样手机和电脑天然在同一网段,不存在隔离策略。拿到地址后先记下来,比如172.20.10.13。
2.2 确认端口占用,别让服务起在错误端口
端口这块,后端启动时一定要监听0.0.0.0,而不是127.0.0.1。127.0.0.1只允许本机访问,手机通过局域网是打不进来的。以常见的 Python 服务为例:
uvicorn main:app --host 0.0.0.0 --port 8080或者:
python main.py但python main.py是否监听0.0.0.0取决于代码里的配置,你要去确认。启动前先查端口有没有被占用,Windows 下:
netstat -ano | findstr :8080如果输出里有LISTENING,说明端口已被占用,要么换端口,要么把占用进程结束掉。Linux/macOS 下:
lsof -i :8080确认端口空闲后再启动服务。启动成功后,本机先自测一下:
curl http://127.0.0.1:8080/health本机通不代表局域网通,这一步只是排除服务本身没起来的问题。真正的局域网连通性验证放到第 4 节。
2.3 把调试请求统一到 TaoToken 通道
到这里你有了 IP 和端口,但每个项目的调试请求如果各自配 Base URL 和 Key,管理起来很乱。TaoToken 的作用是把这些请求统一到一个 API 通道上。你需要在 TaoToken 控制台创建一个 API Key,然后拿到统一的 Base URL。
配置时记住三件套:Base URL、Key、Model ID。Base URL 用https://taotoken.net/api,Key 用你在控制台生成的,Model ID 按你实际调用的模型填。这三样在后面的 JSON 配置里会完整出现。
3. 可复制的 Base URL 与 Key 配置片段
3.1 后端服务的环境变量配置
先在后端项目根目录建一个.env文件,把 TaoToken 的通道配置写进去。这样后端转发调试请求时统一读这里,不用硬编码:
# .env TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_API_KEY=sk-你的实际Key TAOTOKEN_MODEL_ID=你的模型ID BACKEND_HOST=0.0.0.0 BACKEND_PORT=8080注意BACKEND_HOST必须是0.0.0.0,这是手机能访问进来的前提。BACKEND_PORT和你后面 Android 端配置的端口必须一致。
3.2 Android 端的 Base URL 配置
Android 项目里,接口基地址通常放在BuildConfig或gradle.properties里。推荐在gradle.properties中定义,方便切换:
# gradle.properties DEBUG_BASE_URL=http://172.20.10.13:8080/ TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_MODEL_ID=你的模型ID然后在build.gradle里读取:
android { defaultConfig { buildConfigField "String", "DEBUG_BASE_URL", "\"${DEBUG_BASE_URL}\"" buildConfigField "String", "TAOTOKEN_BASE_URL", "\"${TAOTOKEN_BASE_URL}\"" buildConfigField "String", "TAOTOKEN_MODEL_ID", "\"${TAOTOKEN_MODEL_ID}\"" } }代码里用BuildConfig.DEBUG_BASE_URL作为 Retrofit 或 OkHttp 的 baseUrl。这样你换热点、换网段时只改gradle.properties一行,重新打包即可。
3.3 如果你用 Cline / Claude Code 这类工具做联调
有些同学会在 Cline 或 Claude Code 里直接调模型辅助调试。这类工具的配置也是三件套。以 Cline 的 MCP 配置为例,在 settings 里填:
{ "mcpServers": { "taotoken": { "url": "https://taotoken.net/api", "apiKey": "sk-你的实际Key", "model": "你的模型ID" } } }如果你用的是 Codex 的auth.json,结构类似:
{ "baseURL": "https://taotoken.net/api", "apiKey": "sk-你的实际Key", "model": "你的模型ID" }不管哪种工具,Base URL、Key、Model ID 三件套缺一不可。填完之后,工具侧的请求就会走 TaoToken 通道,和你 Android 端访问的后端服务是两条独立的链路,别混淆:Android 端访问的是你本机的http://172.20.10.13:8080,后端再按需转发到 TaoToken。
3.4 网络权限别忘了
Android 端要访问明文 HTTP 的局域网地址,需要在AndroidManifest.xml里允许明文流量,否则 Android 9 以上会直接拦截:
<application android:usesCleartextTraffic="true" ...>生产环境当然要用 HTTPS,但真机无线测试阶段用明文 HTTP 是常规操作。如果你只想对特定地址放行,可以用network_security_config.xml精细控制,这里不展开。
4. 端口连通性验证与真机抓包核对
4.1 先在本机验证服务监听状态
服务启动后,Windows 下确认监听:
netstat -ano | findstr :8080你应该看到0.0.0.0:8080处于LISTENING。如果看到的是127.0.0.1:8080,说明后端没监听所有网卡,手机一定连不上,回去改启动参数。
4.2 从另一台设备验证局域网连通性
最直接的验证是用另一台连在同一热点的设备去 curl。如果手边没有第二台电脑,可以用手机浏览器直接访问:
http://172.20.10.13:8080/health如果浏览器能返回健康检查结果,说明局域网链路通了。如果转圈超时,问题在网段或防火墙。Windows 防火墙经常拦入站,临时放行:
netsh advfirewall firewall add rule name="Debug8080" dir=in action=allow protocol=TCP localport=8080这条命令只是测试期临时用,测完记得删掉。
4.3 真机抓包确认请求命中
手机端发起登录后,怎么确认请求真的打到了你的后端?两个办法。第一,看后端访问日志,如果日志里出现了手机发来的请求路径和手机 IP,说明命中了。第二,用抓包工具。Android 上可以用 Charles 或 Fiddler 做代理抓包,但注意这属于本地调试代理,配置时只针对你的调试设备。
抓包时重点核对三样:请求的 Host 是不是172.20.10.13:8080,请求路径是不是你预期的登录接口,响应码是不是 200。如果 Host 是127.0.0.1或localhost,说明 Android 端 Base URL 没改对,手机把请求发给了自己。如果 Host 对但连接超时,回到 4.2 查防火墙和网段。
4.4 一个完整的成功链路长什么样
后端日志出现类似:
INFO: 172.20.10.5:52070 - "POST /api/login HTTP/1.1" 200 OK这里的172.20.10.5是手机在热点网段下的 IP,52070是手机的临时源端口,200 OK说明登录接口正常返回。到这一步,真机无线测试的链路就算打通了:APK 安装启动正常、手机能访问本机后端、登录接口返回正常。
5. 本篇常见报错排查对照
5.1 Failed to connect to /10.27.239.87:8080
这个报错的关键信息是 IP 段10.x.x.x,通常是校园网或公司网。手机和电脑虽然都联网,但处于客户端隔离状态,互相不可达。解决办法是换网络环境,用手机热点让两者进同一网段。换完后重新 ipconfig 拿新 IP,更新 Android 端 Base URL,重新打包。
5.2 failed to connect to /172.20.10.13 (port 8080) after 20000ms
地址已经是热点网段了,但还是超时。最常见的原因是测试手机当时没连到和电脑相同的热点。注意:电脑连的是 A 手机的热点,测试机却连着自己的流量或另一个 WiFi,那自然不通。确认测试手机连的就是那个热点,保持后端运行,再试一次。另一个可能是 Windows 防火墙拦了入站,按 4.2 放行。
5.3 401 Unauthorized
这个报错说明请求到达了服务端,但鉴权没过。如果你在调试 TaoToken 通道,检查 Key 是否填对、是否过期、Base URL 是否是https://taotoken.net/api。三件套里 Key 最容易出错,复制时别带空格。如果 Key 没问题,看 Model ID 是否和 Key 所属权限匹配。
5.4 local proxy failed
这个报错通常出现在你配了本地代理工具的场景。检查代理配置是否指向了正确的本地端口,以及代理进程是否在运行。如果你并没有主动配代理,检查系统环境变量里有没有残留的HTTP_PROXY/HTTPS_PROXY,有的话清掉再试。
5.5 reading choices 相关报错
这类报错一般出现在调用模型接口、解析返回结构时。常见原因是返回体不是预期的 JSON 结构,或者 Model ID 填错导致返回了错误信息。先确认 Base URL 和 Model ID,再用 curl 直接打一次接口看原始返回:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的实际Key" \ -H "Content-Type: application/json" \ -d '{"model":"你的模型ID","messages":[{"role":"user","content":"ping"}]}'看返回里有没有choices字段,没有的话就是请求本身有问题。
5.6 OAuth 相关报错
如果你用的是 Claude Code 这类带 OAuth 流程的工具,报 OAuth 错误通常是认证态失效或回调地址不匹配。重新走一遍授权流程,确认回调地址和工具配置一致。如果工具支持 API Key 模式,直接切到 Key 模式更省事,避免 OAuth 的来回跳转。
5.7 端口占用导致服务起不来
报错类似Address already in use。用netstat -ano | findstr :8080找到占用进程的 PID,再taskkill /PID <pid> /F结束掉,或者直接换一个端口。换端口后记得 Android 端和 TaoToken 配置里的端口同步改。
6. 把调试链路固定下来的几个实用习惯
真机无线测试最容易反复踩的坑,是每次换网络环境都要重新找 IP、改配置、重新打包。我的做法是把 IP 和端口做成可配置项,而不是硬编码。Android 端用gradle.properties,后端用.env,两边都只改一处。TaoToken 的 Base URL 和 Key 也放环境变量,这样换项目时复制一份配置就行。
另一个习惯是先验证链路再验证业务。顺序永远是:后端起来没、监听地址对不对、手机和电脑同网段没、IP 端口配对不对、最后才看登录逻辑。这个顺序能帮你把 80% 的“连不上”问题挡在业务代码之前。
如果你需要长期做编码和 Agent 联调,可以把 TaoToken 的 Coding Plan 用起来,把模型调用和调试通道统一管理,省得每个项目单独配。需要生成或管理 Key 的时候,直接去控制台操作就行。真机无线测试这条链路,配好一次之后,后面就是改 IP 重打包的重复动作,把配置项抽出来,剩下的都是体力活。