AdAway 的合并去重策略 —— 多源重叠时到底听谁的
这是新手最容易忽略的环节
很多用户加了 5~6 个 hosts 源,以为覆盖范围最大,但实际上:
多个源合并后,条目数不是简单相加。
不同的 hosts 源会互相重叠、互相矛盾。搞不懂合并规则,你可能遇到:
- 明明加了一个专门拦 xxx 广告的源,那个域名却没被拦
- 明明某源声称不拦 xxx,结果还是被拦了
AdAway 的合并逻辑(从源码和文档确认)
步骤一:解析所有启用的源
每个 hosts 源下载后,AdAway 逐行解析:
127.0.0.1 xxx.com→ 拦截规则(block)0.0.0.0 xxx.com→ 拦截规则(block,和上面等价)其他IP xxx.com→ 重定向规则(redirect)# 注释→ 忽略- 空行 → 忽略
- 无效行(没有主机名、主机名格式错误)→ 忽略
步骤二:按主机名分桶
所有规则按主机名聚类:
example.com → [block 规则, redirect 规则]
tracker.io → [block 规则, block 规则]
步骤三:按优先级决定每个主机名的最终处理方式
优先级(从高到低):
- 重定向规则(redirect)> 拦截规则(block)
- 同一主机名如果同时有 redirect 和 block,用 redirect
- 原因:redirect 更"特殊",明确指定了跳转目标,比单纯拦掉更有信息量
- 自定义规则(Allowlist / Blocklist / Redirection List)> hosts 源规则
- 你自己在 AdAway 里手动加的规则优先级最高,永远覆盖 hosts 源
- 同一主机名多个 block 规则 → 去重,只留一条
- 同一主机名多个 redirect 规则 → 去重,只留一条
步骤四:加上 AdAway 自己的 localhost
AdAway 会先加 127.0.0.1 localhost 和 ::1 localhost,然后把合并好的其他规则追加在后面。
步骤五:生成最终 hosts 文件
写入 /system/etc/hosts(root 模式)或注册到 VPN(VPN 模式)。文件开头的注释会列出所有启用的 hosts 源名称。
具体冲突场景示例
场景 1:同一域名在两个源里都有
源 A(Steven Black): 127.0.0.1 tracker.example.com
源 B(Energized): 0.0.0.0 tracker.example.com
合并结果:一条拦截规则 127.0.0.1 tracker.example.com(IP 取第一个遇到的,去重后只留一条)。效果无差别。
场景 2:同一域名一个拦截一个重定向
源 A: 127.0.0.1 google.com
源 B(中国重定向列表): 111.222.1.1 google.com
合并结果:重定向规则 111.222.1.1 google.com。redirect 优先级高于 block。
这就是为什么某些 hosts 源提供"中国重定向列表"——Google、Facebook 这些在国内被墙,但 hosts 源里可能还在拦它们,用重定向列表可以把拦截规则替换成正确的国内 IP。
场景 3:同一域名被 Allowlist(允许列表)放行
源 A: 127.0.0.1 ads.example.com
你自己的 Allowlist: ads.example.com
合并结果:放行。你的 Allowlist 永远覆盖任何 hosts 源的拦截。
场景 4:同一域名被 Blacklist(黑名单)强制拦截
源 A: (没有这个域名)
源 B: (没有这个域名)
你自己的 Blacklist: 127.0.0.1 ads.example.com
合并结果:拦截。自己加的 Blacklist 永远生效,即使没有任何 hosts 源包含它。
冲突总结表
| 规则类型 A | 规则类型 B | 合并结果 |
|---|---|---|
| Block(源) | Block(另一个源) | 保留一条 Block |
| Block(源) | Redirect(源) | Redirect 优先 |
| Block(源) | Allow(自定义) | Allow 优先 |
| Block(源) | Block(自定义 Blacklist) | Block(相同) |
| Redirect(源) | Redirect(自定义) | 保留一条 Redirect |
| Allow(自定义) | Redirect(自定义) | Allow 优先 |
实战建议
- 控制源数量:2~3 个高质量源比 6 个混乱源好——减少冲突、减少过时条目
- 自定义规则覆盖一切:遇到误杀用 Allowlist 放行,遇到漏拦用 Blacklist 补——这是比"换源"更精准的方式
- 重定向规则慎用:重定向会把请求发到指定 IP,如果那个 IP 失效了,APP 会连不上而不是直接空掉,行为可能更怪
- 查看生成的 hosts:主菜单里可以看最终产物,一眼能确认哪些源被合并进来了
