不停隧道,隐藏 Android 的 VPN 通知
Android 可能显示三种不同的 VPN 通知。弄清你看到的那条通知属于哪个应用、每个开关真正改变什么,以及还有什么在继续运行。
你可以隐藏那条提示 VPN 正在运行的通知,隧道仍会照常工作。这让人意外,因为消息和连接感觉像同一个东西。其实并不是。在大多数 Android 手机上,通知抽屉里的条目、状态栏里的钥匙和常驻服务通知可能来自三个不同的主人,而只有其中一个受应用的通知权限约束。要弄清自己能删掉什么,先要看懂眼前这一行是谁发的。
三种通知,三个主人
第一个主人是 VPN 应用本身,它通常发一条常驻通知,带连接或断开操作和会话计时。第二个是 Android 自带的 VPN 指示:SystemUI 绘制钥匙图标,并按版本和厂商不同,显示一条报告当前 VPN 网络的系统级提示。第三个是由工作资料或管理应用控制的设备策略通知。即使它们在通知抽屉里并排出现,也并不是同一个东西。
在动开关之前,先把这条消息分门别类:
| Notice | Who controls it |
|---|---|
| App-owned ongoing notice | The app's notification channel; a long-press shows the channel name and the owning package |
| Foreground-service notice | The service visibility Android requires while the tunnel runs; the app cannot simply drop it |
| System VPN indicator | SystemUI or the manufacturer, driven by the VPN network state rather than by the app's channel |
| Work-policy notice | The administrator or work-profile policy; the phone user may not have the switch at all |
你能看到哪些开关,取决于 Android 版本、厂商的构建以及应用创建的通道。灰色开关是在陈述策略,而不是邀请你绕过它。如果你的构建里根本没有这个开关,诚实的答案是:这条通知不归你删。
找到这一行背后的包
先长按通知并打开它的设置,再去看别的东西。你落到的页面会写出通道名称,而从 Android 8 起,这个通道只属于一个包。如果通道叫 VPN 状态之类,且应用就是你的客户端,那么这条通知归应用所有,该看的是应用自己的设置页。如果你落到一个完全没有通道的系统页面,那你看的是平台指示,应用帮不上忙。
当长按给不出足够信息时,一次 adb 调用就能列出实际发布了什么、由谁发布:adb shell dumpsys notification --noredact,然后在输出里搜索你怀疑的包。你要的是发布该通知的包和通道 ID,而不是能从那里改动的任何东西。把输出当作诊断,因为那份列表里的任何内容都不会改变通知。
在受管理的手机上,答案有时很无趣:通知来自设备策略应用,而拿着手机的人并不是能关掉它的人。这种情况下,管理员控制台是唯一受支持的开关,无论你找到哪个菜单,手机自己的设置都仍是灰的。
Android 13 的权限真正改变了什么
Android 13 把通知变成运行时权限,所以以 API 33 为目标的应用必须先请求,才能发布任何东西。拒绝这个请求后,应用的通知不再出现在抽屉里,这看起来正是人们要找的解法。但 VPN 背后的前台服务仍在运行,即使它的通知已从抽屉里消失,系统仍然会在任务管理器里显示该服务。VPN 授权本身没有被动过:在你断开它或撤销应用的 VPN 同意之前,隧道一直保持连接。
这笔交换比看上去更糟,因为通知也是你查看会话并结束它的最快方式。删掉它,你只是让手机更难理解,路由却一点没变。而通知权限文档描述了抽屉的行为,并没有说明如何在不中断隧道的情况下让它安静下来。
还有一个版本细节值得知道:前台服务通知是服务模型强制要求的,应用不能只因为你拒绝了权限就把它藏起来。有些构建会保留一个精简版本可见,另一些则把证据挪到任务管理器,这个差别是厂商的选择,而不是你漏掉的设置。
演示模式和图标把戏都不是解决办法
你会看到关于演示模式的建议、用未公开的 adb 命令隐藏图标,以及一个让钥匙消失的界面缺陷。这些全都只改变呈现方式。它们都不会改变路由、策略或系统正在跟踪的 VPN 授权,而一个网络状态不可见的手机,比抽屉里多一行的手机更难排查。
一个应用的连接图标也不是健康检查。隧道可能已经断开,而旧接口或过期通知仍在;本地过滤服务也可能抬起 VPN 钥匙,却一个字节都没发往远程出口。要看真实状态,请看系统的 VPN 设置,而不是通知抽屉。
我会怎么改,按顺序来
先确认主人,然后只用这位主人提供的开关。如果通知归应用且是可选的,关掉那个通道,别动服务通道。如果是系统指示,那就接受它,因为它报告的是设备的事实,而不是替某个应用做广告。在受管理的设备上,停在管理员的策略这里,不要去找绕过的办法。
然后确认你仍有受支持的方式检查隧道并断开它,无论是应用自己的界面,还是系统的 VPN 设置页。少一条横幅、又能清楚结束会话的手机,才是你要的结果。反过来,抽屉更安静、却不知道流量有没有被路由,那不算改进。