提示出现的系统条件
Clash Meta for Android 是 Clash.Meta 的图形界面客户端,文档给出的运行条件是 Android 5.0 及以上,并建议 7.0 及以上,支持 armeabi-v7a、arm64-v8a、x86 与 x86_64。它把代理能力放进可安装应用,因此必须走 Android 从 4.0(API 14)起提供的第三方 VpnService,而不是系统内置的 PPTP、L2TP/IPSec 客户端。
第三方 VPN 第一次要变成当前有效服务时,系统会显示连接请求对话框,要求使用者确认信任该 VPN 并接受请求。应用侧对应的是 VpnService.prepare():尚未授权时该方法返回一个 Activity Intent,必须用它拉起系统授权界面;已经准备完成则返回 null。同一用户或工作资料上,只能有一个当前已准备的 VPN 应用。即使本应用曾经获得过授权,再次连接前仍应调用 prepare(),因为期间可能已经改选了其他应用。
所以,首次在 Clash Meta 中启动服务时看到的提示,是系统级确认,不是应用内普通说明。没有这一步,后面无法建立本地 TUN 接口,也就谈不上把流量交给 Clash.Meta 内核。
对话框实际在确认什么
该对话框由系统绘制,形态接近相机、通讯录一类权限确认。它确认的是:该应用将被允许创建本地虚拟网卡,按 VpnService.Builder 写入的地址与路由接管流量,并从接口文件描述符读写 IP 包。应用负责读出站包并加密后发往网关,再把入站解密包写回接口。文档要求与网关之间使用强加密。授权只解决系统是否允许该应用成为 VPN 服务,并不审核订阅、节点或配置文件是否安全。
判断是否接受,建议同时核对三件事。第一,请求方是本机已安装的 Clash Meta for Android。官方仓库给出的应用包名为 com.github.metacubex.clash.meta;自行编译时可按文档把 applicationId 改成自定义值,未改时相关标识为 com.github.metacubex.clash,并可能带有后缀。第二,当前用户或工作资料里没有必须继续占用的另一个 VpnService。启动新服务会自动停止已有服务。第三,理解授权后系统可能按应用写入的路由(例如 0.0.0.0/0 或 ::/0)把匹配流量送进该接口。任一条件不清楚时,应取消本次请求。
接受之后如何核对,失败时下一步
接受后,该应用会出现在设置里的网络和互联网 VPN 列表中,表示连接请求已被接受。该页还可以配置系统选项或忘记该 VPN。授权成功不等于已经连通。应用仍须按文档顺序:必要时再次 prepare();对隧道套接字调用 VpnService.protect(),避免套接字自己走进系统 VPN 形成环路;连接网关;用 Builder 至少添加地址,按需要添加路由和 DNS;最后 establish()。应用未准备或权限被收回时,establish() 返回 null,本地接口不会建立。
服务活动期间,状态栏会显示 VPN 钥匙图标,快捷设置中可打开信息面板并进入设置。应用还需要给出不可消除的通知,点按后回到前台,服务停止后应去掉通知。若对话框出现后无法继续:先看是否被其他 VPN 占用了当前已准备的位置;再打开上述 VPN 设置页,确认本应用是否已在已接受列表。列表没有该项,说明授权未完成,需要重新从应用启动服务以再次触发 prepare()。列表已有该项但接口仍是 null,应转向服务是否以前台形式运行、Builder 是否至少具备地址与必要路由,而不是反复处理对话框本身。
https://developer.android.com/develop/connectivity/vpn https://github.com/MetaCubeX/ClashMetaForAndroid