卸载前要处理哪些系统状态
Clash Meta for Android 以 VpnService 方式工作。使用者首次同意连接请求后,应用会留在设置里网络和互联网 VPN 页的已接受列表中。系统还可能在 Android 7.0 及以上为该应用打开 always-on,并在选项中阻止不经过 VPN 的连接。卸载只移除应用包,不保证这些系统侧状态会按预期消失。
文档写明:在 VPN 页面断开或忘记 VPN 应用,或关闭活动连接的 always-on 时,系统会停止活动连接,并调用服务的 onRevoke(),且该回调不一定在主线程。调用时已经有替代网络接口在路由,应用应关闭受保护的隧道套接字和 ParcelFileDescriptor。若卸载前仍处于活动连接,尤其是打开了阻止不使用 VPN 的连接,可能出现短暂无网,或系统仍显示钥匙图标一类残留提示。每个用户或工作资料只能有一个活动 VPN 服务,残留的已准备状态还会影响下一个应用调用 prepare()。
整理目标可以概括为:停止服务、撤销系统准备、处理 always-on 与拦截选项,再卸载包名为 com.github.metacubex.clash.meta(或自行编译时写入的自定义 applicationId)的应用。
建议按层处理的步骤
第一层,在应用仍可运行时停止 VPN 服务。文档要求应用提供手动停止连接的方式;系统也可以在 VPN 设置页断开。仓库还提供向 ExternalControlActivity 发送 STOP_CLASH 或 TOGGLE_CLASH 意图的方式。停止后,活动通知应被移除,状态栏钥匙图标应消失。图标还在时,不要直接卸载。
第二层,处理 always-on。Android 8.0 及以上在 always-on 断开或连不上时会显示不可消除通知。系统负责启停时,卸载前仍须在设置里关闭 always-on,否则开机后系统可能尝试拉起已经不存在的服务。若应用清单将 SUPPORTS_ALWAYS_ON 设为 false(Android 8.1 及以上),设置中相关控件会被禁用,这一层可以跳过。
第三层,在网络和互联网 VPN 页忘记该应用。该页列出已接受连接请求的应用,并提供配置系统选项或忘记的操作。忘记后,该应用不再处于已准备状态,下次安装必须重新 prepare() 并经过连接请求对话框。若使用过按应用 VPN 的允许名单或禁止名单,名单绑定在当次连接的 Builder 上,断开后即失效,不必在系统设置里逐条删除;但应用内部保存的配置、订阅以及经 clash:// 或 clashmeta:// 导入的内容属于应用数据,卸载是否保留取决于系统是否保留数据,需要单独决定是否先复制出去。
工作资料与个人资料可以运行不同的 VPN 应用,必须在实际安装该应用的资料里执行忘记与关闭 always-on。
怎样判断已经整理干净
判断依据包括:VPN 设置列表中不再出现该应用;状态栏无钥匙图标;快捷设置无该连接的信息面板;always-on 相关通知不再出现;其他应用恢复走系统网络。若曾经打开阻止非 VPN 连接,关闭后应恢复未走隧道时的联网方式。
忘记后列表仍在,可能看错了工作资料,或设备策略不允许个人修改 VPN。卸载后仍提示 VPN 异常,检查是否还有第二个实现 VpnService 的应用,以及系统内置传统 VPN 是否仍开着。新安装的 Clash Meta 即使包名相同,也必须重新走连接请求对话框,因为准备状态绑定的是授权记录,而不是曾经安装过。
不要在 always-on 仍开启时强行卸载,随即立刻安装其他 VPN,以免系统按旧包名拉起服务失败并持续通知。整理完成后再卸载,下一个应用才能干净地调用 prepare()。仓库要求最低 Android 5.0、建议 7.0,always-on 相关行为以 7.0 与 8.0 的系统说明为准。低于上述版本时,部分系统选项可能不存在,仍应至少完成停止服务与忘记 VPN 这两步。
https://developer.android.com/develop/connectivity/vpn https://github.com/MetaCubeX/ClashMetaForAndroid