AdAway 中文文档 下载 App

Android 上的 hosts 文件到底是什么 —— 系统级域名映射表工作原理

先从一个常识说起

当你在手机上打开任何一个 APP 或浏览器,输入一个域名——比如 example.com——系统会做什么?按顺序:

  1. 先查本地 hosts 文件有没有这个域名的映射
  2. 没有,就问 DNS 服务器(运营商、路由器、Google 的 8.8.8.8)
  3. DNS 返回 IP 地址
  4. APP 拿着 IP 去连服务器

hosts 文件就是插在第 1 步。如果某个域名在 hosts 里有记录,系统就不再问 DNS,直接用那个映射的 IP。

一个 hosts 文件长什么样

最简单的 hosts 文件就是一堆行,每行两个字段:

127.0.0.1 localhost
0.0.0.0 doubleclick.net

左边是 IP 地址,右边是主机名。# 开头的是注释行,系统忽略。

Android 的 hosts 文件位置固定在 /system/etc/hosts,格式和 Linux、Windows 上的一模一样。系统启动时就会读它,所有 APP 的 DNS 查询都会先过这里。

AdAway 利用的就是这个机制

常规 hosts 文件里只需要一行 127.0.0.1 localhost(让系统自己认自己)。AdAway 做的事情很简单:

  1. 从公开的 hosts 源下载上万个广告/跟踪域名的列表
  2. 给每个域名配一行 127.0.0.1 域名 或 0.0.0.0 域名
  3. 把合并后的完整表写回 /system/etc/hosts
  4. 之后任何 APP 请求这些广告域名时,系统直接返回 127.0.0.1——也就是"自己",什么都不会返回

为什么这比浏览器插件管用

浏览器插件(比如 AdBlock Plus、uBlock Origin)只能拦浏览器发起的请求。但你的手机上至少有二三十个 APP,每个都可能开屏就弹广告、插屏广告、推送广告。

AdAway 不管是哪个 APP 发的请求,只要域名在 hosts 里,就一律拦。这就是"系统级"的含义——它管的是整条 DNS 解析链,不是某一个 APP 的行为。

一个容易忽略的细节

hosts 文件对"数值 IP 直连"的请求无能为力。有些游戏不走域名,直接硬编码 IP 地址连广告服务器,这种 AdAway 拦不住。同样,绕过 DNS 的代理请求(比如 Chrome 的 Data Saver、某些运营商的 HTTP 代理)也不会被 hosts 文件影响。这些是 hosts 方案的天然边界。

小结

方式能拦浏览器广告能拦 APP 内广告原理
浏览器插件✅❌只在浏览器进程内拦截
AdGuard / Blokada(VPN 模式)✅✅在虚拟网卡层拦截所有 DNS
AdAway(root 模式)✅✅hosts 文件系统级拦截
AdAway(VPN 模式)✅✅虚拟网卡 + hosts 文件

AdAway 不是唯一能拦 APP 内广告的工具,但它是唯一把拦截规则写进系统文件、几乎零开销的方案。