本文速览

适合点击 v2rayNG 连接按钮后立即停止,或日志连续报错的安卓用户。先确认故障发生在配置读取、本地监听还是远端连接阶段,再沿错误链找到具体字段。本文提供日志采集步骤、常见报错对照和配置片段;每次只修改一处,避免把原本可定位的问题改成多处故障。

先分清:内核没启动,还是启动后连接失败

v2rayNG 是安卓客户端,本文围绕其使用的 Xray 内核日志排查。点击连接后出现 VPN 图标,只能说明安卓侧建立了相应服务状态,不能单凭图标确认节点可用。反过来,网页打不开也不一定是内核启动失败:本地监听已建立、首次访问时才出现超时,通常要查远端连接链路。

故障阶段日志线索优先检查
读取配置failed to read config files、invalid characterJSON 语法、配置来源
构建配置failed to build 后接具体字段原因协议名称、字段类型、内核支持情况
建立本地监听bind: address already in use监听地址与本地端口
发起远端请求i/o timeout、connection refused服务器地址、远端端口与线路
安全或传输握手x509:、bad handshake证书域名、TLS 与传输参数

同一条日志可能用 > 串起多层原因。前面的“启动失败”是结果,后面关于字符、端口或证书的描述才更接近根因。阅读时先保留整条错误链,再从末尾向前找具体对象,不要只截取最醒目的红色一行。

采集一次干净日志:从点击连接开始

先保留当前节点与自定义配置,再采集日志。v2rayNG 不同版本的翻译与入口位置可能略有差异;常见入口是主界面左上角菜单中的「日志」,日志等级在「设置」中调整。找不到同名选项时,以当前版本界面为准,不要照搬桌面 v2rayN 的「参数设置」路径。

  1. 记录环境

    在安卓「设置」→「应用」→「v2rayNG」的应用信息中记录客户端版本,并记录安卓版本、节点协议以及是否使用自定义配置。日志若显示内核版本,也一并保留。

  2. 停止连接

    回到 v2rayNG 主界面,点击连接按钮停止服务。暂时停止其他 VPN 应用,避免安卓 VPN 服务切换造成额外干扰。

  3. 调整等级

    进入「设置」→「日志等级」,先选 info;线索不足时临时改为 debug。若使用完整自定义 JSON,还要检查其中的 log.loglevel。

  4. 复现一次

    打开「日志」,使用清空操作移除旧记录,再回主界面连接一次。若服务保持运行,访问一次网页,随后返回日志查看同一时间段。

  5. 保留上下文

    复制首次失败前后的完整记录。分享前遮盖订阅地址、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 安装的默认设置;应以「设置」中显示的本地端口和实际日志为准。

10808
示例:本地 SOCKS 监听端口
10809
示例:本地 HTTP 监听端口
443
示例:节点远端服务端口

报错: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。客户端界面上的协议名称也不一定等于配置里的字符串。

下面是 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 行号,怎么找出错位置?

若是自定义配置,先在本地编辑器格式化副本,再搜索日志提到的字段。若是普通节点配置,回节点编辑页核对对应参数;不要为了找行号就随意改写整份配置。

重装客户端会更快吗?

先备份配置并复制日志。端口冲突、服务端证书或错误订阅参数不会因为重装自动修复;只有确认应用数据异常,并保留好恢复资料后,再考虑清理数据或重新安装。

最后保留一份简短排查记录:客户端版本、使用的内核信息、首次完整错误、唯一改动项与复测结果。这样即使后续再次遇到相同报错,也能判断是旧问题复发,还是错误已经进入了下一个阶段。