OpenVPN Connect 与 Tasker:用配置文件 ID,而非名称
Android 3.3.2 及以上的 OpenVPN Connect 接受配置文件 ID,而不是显示名称。重建 Tasker intent,并把下一步绑定到真实连接状态。
一个多月来稳定连上的自动化,在客户端更新后突然失效,而同一个配置文件手动连接仍然正常。这种模式指向控制契约,而不是 VPN 服务器。有人改了应用接受的动作,或它期待的标识符,而任务仍在发送旧的。重建绑定比重新检查服务器更省时间。
契约属于一个应用和一个版本区间
OpenVPN Connect 与 OpenVPN for Android 是两个不同的应用,点名其中一个包的 intent 在另一个里毫无作用。动手改任务之前,先确认装的是哪个客户端,以及你对比的行为出自哪个版本。对 Android 3.3.2 及以上的 Connect,官方文档里的 Tasker 集成期待的是配置文件 ID。旧教程在显示名称前加 AS 或 PC,描述的是上一版契约,把它们照搬进当前任务,正是毫无反应最常见的原因。
这个版本边界解释了大多数「以前能用」的报告。应用没有弄坏功能,只是改了功能接受什么。把版本区间当成你所写契约的一部分。
标识符从哪里来
在 Connect 里打开目标配置文件,从该配置文件自身的详情中复制配置文件 ID。用这个值,而不是你在列表里认得的名字,因为名字只是标签,应用匹配的是标识符。Tasker 的 Send Intent 动作里,连接字段与下方代码块相同,只替换标识符。个人配置文件与工作配置文件的实例也要保持一致。
Action: net.openvpn.openvpn.CONNECT
Extra: net.openvpn.openvpn.AUTOSTART_PROFILE_ID:'PROFILE_ID'
Extra: net.openvpn.openvpn.AUTOCONNECT:true
Package: net.openvpn.openvpn
Class: net.openvpn.unified.MainActivity
Target: Activity
工作配置文件里的副本若包名相同、存储的配置文件不同,会接受 intent 却找不到匹配的配置文件,看起来像任务坏了,而不是作用域搞错了。如果配置文件被重新导入或替换,就把标识符当作可疑,重新核对。重新导入常常会生成新的配置条目,即使显示名称没变。先查标识符,再改别的。
按文档把无关字段留空。文档没要求的类别、MIME 类型与数据字段会改变 Android 解析 intent 的方式,解析结果不同的 intent 可能只打开应用而不启动你的配置文件。
这个动作做了什么,又留给你什么
发送连接 intent 只是请应用启动一个配置文件。它不会绕过该配置文件所需的任何授权。Connect 仍可能弹出提示,所以文档里的自主场景假定没有额外授权,也没有已保存的连接凭据。诱人的做法是把密码或私钥机密塞进共享的 Tasker 导出文件,以此绕开这道边界。
不要这样做。任务导出是纯文本文件,人们会把它复制到聊天里,一旦分享,里面的机密当场泄露。如果配置文件需要凭据,用应用自己保存的连接凭据,让 MFA 提示继续当提示。任何靠保存答案来躲开提示的做法,只是把机密挪了个地方,并没有解决问题。
断开那一侧有自己的文档动作,而不是对客户端耍的花招:
Action: net.openvpn.openvpn.DISCONNECT
Extra: net.openvpn.openvpn.STOP:true
Package: net.openvpn.openvpn
Class: net.openvpn.unified.MainActivity
Target: Activity
故意连一个不存在的配置文件来逼出断开,是旧帖里那种绕法,更新之后会静默失败。用显式动作。
下一步执行之前先检查状态
intent 启动成功只证明请求发出去了,不证明隧道存在。如果任务随后要打开内部应用,那一步需要一个带超时上限的就绪条件。发送后立刻执行的动作,迟早会撞上提示框。
$ adb shell cmd package resolve-activity --brief net.openvpn.openvpn
net.openvpn.openvpn/net.openvpn.unified.MainActivity
$ adb shell dumpsys activity activities | grep -i openvpn
resolve 查询确认你目标的包与 Activity 在该设备上存在,从而排除类名字段里的拼写错误。Activity dump 显示任务跑完之后真正在前台的是什么,也是看应用究竟是弹了提示还是真连上的最省事办法。任务失败后两样都跑,而不是猜哪个字段错了。类名不匹配会立刻报错,而配置文件缺失根本不会给出任何可见错误。
发布任务之前,先定好断开的归属。一个会拆掉别的任务所依赖隧道的快捷方式,会生成一张完全看不出原因的工单。保留两套都控制同一个客户端的自动化,会产生无法从日志里排查的竞态,所以新的能用了就删掉旧动作。