适合点击 v2rayNG 连接按钮后立即停止,或日志连续报错的安卓用户。先确认故障发生在配置读取、本地监听还是远端连接阶段,再沿错误链找到具体字段。本文提供日志采集步骤、常见报错对照和配置片段;每次只修改一处,避免把原本可定位的问题改成多处故障。
先分清:内核没启动,还是启动后连接失败
v2rayNG 是安卓客户端,本文围绕其使用的 Xray 内核日志排查。点击连接后出现 VPN 图标,只能说明安卓侧建立了相应服务状态,不能单凭图标确认节点可用。反过来,网页打不开也不一定是内核启动失败:本地监听已建立、首次访问时才出现超时,通常要查远端连接链路。
| 故障阶段 | 日志线索 | 优先检查 |
|---|---|---|
| 读取配置 | failed to read config files、invalid character | JSON 语法、配置来源 |
| 构建配置 | failed to build 后接具体字段原因 | 协议名称、字段类型、内核支持情况 |
| 建立本地监听 | bind: address already in use | 监听地址与本地端口 |
| 发起远端请求 | i/o timeout、connection refused | 服务器地址、远端端口与线路 |
| 安全或传输握手 | x509:、bad handshake | 证书域名、TLS 与传输参数 |
同一条日志可能用 > 串起多层原因。前面的“启动失败”是结果,后面关于字符、端口或证书的描述才更接近根因。阅读时先保留整条错误链,再从末尾向前找具体对象,不要只截取最醒目的红色一行。
采集一次干净日志:从点击连接开始
先保留当前节点与自定义配置,再采集日志。v2rayNG 不同版本的翻译与入口位置可能略有差异;常见入口是主界面左上角菜单中的「日志」,日志等级在「设置」中调整。找不到同名选项时,以当前版本界面为准,不要照搬桌面 v2rayN 的「参数设置」路径。
-
记录环境
在安卓「设置」→「应用」→「v2rayNG」的应用信息中记录客户端版本,并记录安卓版本、节点协议以及是否使用自定义配置。日志若显示内核版本,也一并保留。
-
停止连接
回到 v2rayNG 主界面,点击连接按钮停止服务。暂时停止其他 VPN 应用,避免安卓 VPN 服务切换造成额外干扰。
-
调整等级
进入「设置」→「日志等级」,先选
info;线索不足时临时改为debug。若使用完整自定义 JSON,还要检查其中的log.loglevel。 -
复现一次
打开「日志」,使用清空操作移除旧记录,再回主界面连接一次。若服务保持运行,访问一次网页,随后返回日志查看同一时间段。
-
保留上下文
复制首次失败前后的完整记录。分享前遮盖订阅地址、UUID、密码和服务器信息,但保留字段名、错误顺序以及同一地址的对应关系。
debug 提供细节,info 记录常规过程,warning 提醒异常,error 表示某项操作失败。它们不是“节点好坏”的评分。某次请求的错误不等于整个内核退出,而没有错误记录也可能只是日志等级过高。排查完成后把详细日志等级调回原值,减少不必要的记录。
JSON 语法错误:先修格式,再查节点
自定义配置刚导入就启动失败,优先看解析错误。JSON 的属性名和字符串必须使用英文双引号;中文引号、漏逗号、多余尾逗号都会造成问题。为便于迁移与排错,示例使用严格 JSON,不依赖某个加载器对注释的扩展支持。
报错:invalid character '}' looking for beginning of object key string
原因:对象最后一个属性后仍有逗号,解析器正在等待下一个属性名,却遇到了右花括号。
解法:检查报错位置前一个属性,删除尾逗号;同时检查相邻对象,不要直接删除右花括号。
报错:unexpected end of JSON input
原因:内容提前结束,常见于复制不完整、缺少右括号或字符串没有闭合。
解法:从原始配置重新导入,检查末尾的引号、方括号与花括号是否配对,避免凭感觉连续补括号。
例如下面的局部片段中,"warning" 后面多了一个逗号。报错可能指向下一行的右花括号,而不是逗号本身,所以定位时要向前多看一行。
{
"log": {
"loglevel": "warning",
}
}
修正后的片段如下。它只演示 log 的写法,不是一份能独立连接的完整配置;应在原文件中替换对应对象,不要覆盖原有的入站、出站和路由。
{
"log": {
"loglevel": "warning"
}
}
端口占用:核对本地监听,不改服务器端口
bind 报错发生在本地监听阶段。它和连接远端失败是两类问题。下面的数字是排查示例,不代表所有 v2rayNG 安装的默认设置;应以「设置」中显示的本地端口和实际日志为准。
报错:bind: address already in use
原因:目标地址上的监听端口已有进程使用,也可能是自定义配置里两个入站重复绑定了同一个端口。
解法:先停止相关服务再重试;仍失败时检查完整配置中的 inbounds,核对每项的 listen、port 与协议。
如果日志明确指出 127.0.0.1:10808 绑定失败,可以尝试把本地 SOCKS 端口改为未占用的 10818,然后重新启动。依赖该 SOCKS 端口的其他应用也要同步修改。只改节点编辑页里的远端端口,既不能释放本地监听,还可能破坏原本正确的节点参数。
结论:先看地址归属,再改端口
错误中是 127.0.0.1 且包含 bind,先查手机本地监听;错误中是服务器地址且包含连接超时,再查远端连接。两个方向不要同时修改。
字段拼写与内核支持:JSON 合法还不够
JSON 能解析,只说明格式正确,不代表 Xray 能接受每个值。例如 streamSettings 中的 network 要使用内核支持的传输标识,WebSocket 对应 ws,不能随手写成 websocket。客户端界面上的协议名称也不一定等于配置里的字符串。
- 查字段大小写:
streamSettings、serverName、wsSettings应按配置规范书写,不要靠近似拼写猜测。 - 查字段类型:布尔值写
true或false,不要加引号变成字符串;端口通常使用数字。 - 查所属层级:TLS 的
serverName放在对应的tlsSettings中,不能随意挪到出站对象顶层。 - 查参数组合:VLESS、VMess 是代理协议;WebSocket 是传输方式;TLS 是安全层。导入时要分别核对,不能互相替代。
下面是 WebSocket 与 TLS 的结构示例,只用于核对层级。域名和路径都是示例值,实际使用必须与服务端设置一致;这段对象本身不是完整出站配置。
{
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {
"serverName": "example.com"
},
"wsSettings": {
"path": "/tunnel",
"headers": {
"Host": "example.com"
}
}
}
}
还要注意,未知字段不一定触发启动报错,有些加载流程会忽略它,导致本想启用的设置没有生效。相反,新参数交给不支持它的旧内核,可能在构建配置时失败。更新前记录客户端与内核信息,保留原配置;更新后先测试原节点,不要同时更换协议和整套路由。
传输与证书错误:通常发生在启动之后
如果内核已经建立本地监听,只有访问网页时才出现下面的错误,就不要继续围着 JSON 逗号排查。先确认节点地址和远端端口,再核对 TLS、安全参数与传输配置。以下是常见错误片段,完整前缀和包装文字会随内核版本变化。
报错:websocket: bad handshake
原因:WebSocket 握手未得到预期响应,常见于路径、Host、远端端口或反向代理转发不匹配。
解法:对照服务端提供的信息检查 path、Host 与 TLS 开关;不要只看到“握手”就修改 UUID。
报错:x509: certificate has expired or is not yet valid
原因:证书有效期不符,可能是服务器证书过期,也可能是手机时间错误。
解法:先在安卓系统「日期和时间」中启用自动设置并确认当前日期;时间正确仍报错时,让服务提供方检查证书。
报错:connection refused
原因:连接被主动拒绝,可能是目标端口没有服务监听,或中间设备返回了拒绝响应。
解法:核对错误中的目标地址与端口,再确认服务端监听状态。单改本地 SOCKS 端口不能解决远端拒绝连接。
报错:i/o timeout
原因:某个网络操作在期限内未完成,仅凭这句话无法断定是 DNS、线路还是服务端问题。
解法:保留其前面的操作对象,区分域名解析、拨号连接与握手;在同一配置下切换 Wi-Fi 和移动网络作对照。
TLS 的 serverName 用于服务端名称相关的握手与证书验证,WebSocket 的 Host 用于 HTTP 层请求。两者可能相同,也可能由服务部署方式决定。不要为了消除错误而直接关闭证书验证,这会掩盖域名或证书配置问题。
修复后复测:保留证据,不连续盲改
完成一次修改后,停止服务、清空旧日志,再重新连接。先确认内核能够持续运行,再发起一次网页请求,最后检查这次请求有没有新的错误。若订阅更新会重新生成节点,手动修改可能被覆盖,因此应记录改动原因,而不是只记住“现在能用了”。
日志里全是 warning,要全部修掉吗?
不用把每条警告都当作启动失败。先按时间找到本次连接对应的错误链,再确认服务是否退出、请求是否失败。只处理与当前症状有关的警告,避免引入额外变量。
订阅导入成功,为什么还是启动不了?
导入成功只说明客户端接受了订阅内容,不保证生成的每项参数都被当前内核支持。先选中一个节点复现,检查日志中的协议或字段错误,再核对客户端版本与节点要求。
没有 JSON 行号,怎么找出错位置?
若是自定义配置,先在本地编辑器格式化副本,再搜索日志提到的字段。若是普通节点配置,回节点编辑页核对对应参数;不要为了找行号就随意改写整份配置。
重装客户端会更快吗?
先备份配置并复制日志。端口冲突、服务端证书或错误订阅参数不会因为重装自动修复;只有确认应用数据异常,并保留好恢复资料后,再考虑清理数据或重新安装。
最后保留一份简短排查记录:客户端版本、使用的内核信息、首次完整错误、唯一改动项与复测结果。这样即使后续再次遇到相同报错,也能判断是旧问题复发,还是错误已经进入了下一个阶段。