非 Root 设备的 AdAway —— 本地 VPN 拦截模式完整指南
为什么需要 VPN 模式
Android 从 6.0 开始对 /system 分区实施只读保护,没有 root 就无法修改。AdAway 在 v5 版本开始引入 VPN 模式作为非 root 设备的替代方案。
VPN 模式的核心思路:让系统创建一个虚拟的 VPN 网卡,把所有 DNS 请求先路由到这个网卡,由 AdAway 检查域名是否在 hosts 黑名单里,然后决定返回什么。
前置条件
- AdAway v5.x 或 v6.x(v4 没有 VPN 模式)
- Android 8.0+
- 不需要 root
配置步骤
第一步:首次启动,选择拦截模式
第一次打开 AdAway 会弹向导:
- 向导会自动检测是否有 root 权限
- 没有 root → 进入 VPN 模式配置
- 点"启用"或类似按钮,Android 会弹出一个系统级对话框:
"AdAway 请求建立 VPN 连接。所有网络流量可能都会被监控。"
- 点"确定"或"允许"
- AdAway 主界面应该切换为绿色"已启用"状态
这个对话框是 Android 的安全机制——任何 APP 创建 VPN 都必须由用户手动确认。AdAway 的 VPN 不加密、不转发到外部服务器,只在本地拦截 DNS。
第二步:下载 hosts 源
VPN 模式下也需要 hosts 源——AdAway 用同样的 hosts 文件语法来做拦截规则。默认会推荐几个 hosts 源,点下载即可。也可以自己添加更多源,详见 添加自定义源。
第三步:启用
下载完 hosts 源后点"应用"按钮,AdAway 会:
- 合并所有选中的 hosts 源
- 在虚拟 VPN 里注册这些拦截规则
- 开始拦截 DNS 请求
VPN 模式的工作原理
和 root 模式对比一下:
| Root 模式 | VPN 模式 | |
|---|---|---|
| hosts 文件位置 | 真实的 /system/etc/hosts | 虚拟网卡的 DNS 过滤器 |
| 拦截时机 | DNS 查询第一步(系统原生) | DNS 请求离开手机前 |
| 性能影响 | 几乎零 | 轻微(需要虚拟网卡处理每个 DNS 请求) |
| 电池消耗 | 几乎零 | 有(VPN 进程需要常驻) |
| 需要 root | 是 | 否 |
Private DNS(Android 9+)冲突
从 Android 9 (Pie) 开始,系统默认启用 Private DNS,使用 DNS over TLS/HTTPS。这会绕过 AdAway 的 VPN DNS 拦截——因为 DNS 请求被加密后直接发给了 Private DNS 服务器,不经过系统的 DNS 解析流程。
解决方法:临时禁用 Private DNS
- 系统设置 → 网络和互联网 → 高级 → 私人 DNS
- 选择"关"(不要选"自动")
- 确认
AdAway v6 尝试了和 Private DNS 共存的方案(初步 DOH 支持),但实践中还是禁用 Private DNS 最稳。
常见局限
VPN 模式下 AdAway 拦不住的情况:
- APP 自己实现 DNS 解析器:不走系统 DNS,直接发 UDP/TCP 包——极少数 APP 会这么做
- APP 直接用 IP 地址:不走域名,hosts 和 VPN 都无效——一些游戏有这种情况
- 运营商 HTTP 代理:移动网络的 APN 设置里可能有代理,会绕过 DNS 拦截——手动清除 APN 代理字段
- 同一台手机上多个 VPN APP:Android 只允许一个活跃 VPN,AdAway 和其他 VPN(比如 AdGuard、Nitro)不能同时开
电池影响
VPN 模式比 root 模式耗电更多,原因:
- VPN 进程需要常驻后台(Android 会定时唤醒它处理 DNS 请求)
- 每次 DNS 查询都会过一遍 hosts 文件(但 AdAway 做了哈希索引,比线性遍历快得多)
实测日常使用下,VPN 模式的额外电量消耗大约是 3%~8%(不同机型差异大),可以接受但不如 root 模式干净。
和 AdGuard VPN 模式的对比
AdAway 的 VPN 模式和 AdGuard 的 VPN 模式在技术路径上不同:
- AdGuard 走的是 HTTPS 流量深度检查,能做 CSS 元素隐藏、脚本拦截、反绕过
- AdAway 的 VPN 模式只做 DNS 级拦截,和 root 模式一样只拦截域名
- 所以 AdAway VPN 模式的拦截"深度"比 AdGuard 浅——它拦不住需要 CSS 隐藏的元素(比如某些网站的横幅广告)
但 AdAway 免费、开源、无内购。
