系统会把 VPN 状态暴露在哪些地方
核对 Clash Meta 手机端相关的“系统 VPN 选项”,应看 Android 为所有 VpnService 应用提供的界面,而不是只看客户端进程是否还在。官方列出的系统组件包括:首次激活前的连接请求对话框;Settings > Network & Internet > VPN 中已接受请求的应用列表,以及配置系统选项或忘记该 VPN 的入口;连接活动时快捷设置托盘的信息面板;状态栏的 VPN 钥匙图标。Android 8.0 及以上,始终开启若断开或无法接通,还会出现不可消除通知。
Clash Meta for Android 是 Clash.Meta 的图形界面,包名 com.github.metacubex.clash.meta,建议运行在 Android 7.0 及以上(始终开启也要求该版本)。每个用户或工作资料同一时间只有一个活动服务,也只能有一个当前已准备的 VPN 应用。因此“当前状态”包含三层:是否已授权、系统选项(始终开启、阻止无 VPN 连接)是否打开、是否存在活动接口。
逐步核对当前状态的方法
适用条件:可以打开系统设置;该应用至少被安装;你需要确认的是系统策略,而不是配置文件内容。按下列顺序检查,每步都留下可观察结果:
- 打开 Settings > Network & Internet > VPN。若列表中没有该应用,说明连接请求从未被同意,或已被忘记。此时
VpnService.prepare()再次调用应返回需要授权的 Activity Intent,而不是空值。 - 进入该应用的系统选项。查看始终开启是否打开。始终开启打开意味着系统可在开机时启动服务,并在运行期间维持生命周期;应用应保存配置以便被系统按需拉起。若应用通过
SERVICE_META_DATA_SUPPORTS_ALWAYS_ON=false声明不支持,设置里相关控件会被系统禁用,这本身就是一种明确状态。 - 查看“Block connections without VPN”。打开时,设置应用会警告 VPN 连通前没有互联网。该项与始终开启独立,必须单独记录。
- 观察运行时指示:状态栏钥匙图标、快捷设置信息面板表示有活动连接;8.0 及以上不可消除通知表示始终开启仍被要求但连接失败。点按快捷设置标签会打开含更多信息的对话框并提供到设置的链接,可用于把“托盘提示”和 VPN 页选项对照。
- 若设备有工作资料,再查该资料下的 VPN。官方写明每个用户或工作资料可以运行不同 VPN 应用,主用户列表正常不等于工作资料未启用始终开启或拦截。
判断依据要成对使用:列表有应用且曾授权,只说明可成为当前 VPN;钥匙图标只说明有活动会话;拦截开关只说明非 VPN 流量是否被阻断。三者任一都不能替代另外两项。
核对结果矛盾时下一步
若应用内显示已停止,但钥匙图标仍在:到 VPN 页看始终开启是否把服务再次拉起,或是否另有应用成为活动服务(启动新服务会自动停止旧服务)。若图标不在,但所有应用无网:优先核对拦截是否仍开,因为服务停止后拦截仍会造成无网。若 establish() 失败,文档指出方法会返回空,前提是应用未准备或权限被撤销——对应动作是重新走连接请求,或检查是否在设置里执行了断开、忘记、关闭始终开启;这些会触发 onRevoke(),且回调时流量已经改走其他接口。
仓库提供的 TOGGLE_CLASH、START_CLASH、STOP_CLASH 意图只能切换应用服务,不能用来读取系统始终开启或拦截开关。系统状态仍以设置 VPN 页、状态栏和快捷设置为准。核对完成后,把“已授权 / 始终开启 / 拦截 / 活动图标”四项分别记下,避免用单一现象概括全部选项。
参考资料: https://developer.android.com/develop/connectivity/vpn https://github.com/MetaCubeX/ClashMetaForAndroid