Android 系统层面的广告屏蔽

Lobsters Hottest 新闻

摘要

作者 Kevin Boone 撰文讲解如何在 2026 年的 Android 系统层面屏蔽广告,介绍了基于 DNS 劫持的四种主要方法(商业 DNS 服务、带广告过滤的 VPN、无需 root 的过滤应用、以及需要 root 的方案),并讨论了各自的优缺点与隐私注意事项。

<p><a href="https://lobste.rs/s/hk0ohb/system_level_ad_blocking_android">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/10/03 20:52

# 2026 年 Android 系统级广告拦截 来源:https://kevinboone.me/adblock.html 互联网已经变成了一个广告平台。移动设备的用户对此感受尤其深刻,因为除了网络上到处都是广告之外,移动操作系统环境和应用还在不断向用户强塞广告。如今在 Android 手机上避开广告变得越来越难,因为 Android 越来越封闭、越来越难以定制。Google 当然不会乐意让广告拦截变得容易。 不过,即使在 2026 年,压制大部分广告依然是可能的。 这篇文章专门讨论在*系统*层面拦截广告,也就是在 Android 平台本身层面进行,而不是针对某个特定应用。某些 Android 应用,尤其是网络浏览器,本身就具备广告拦截功能,或者可以通过第三方插件添加此类功能。但奇怪的是,DuckDuckGo 浏览器虽然会拦截伴随定向广告而来的*跟踪*行为,却并不专门拦截广告——你还需要额外的手段。 如果你在系统层面拦截广告,那么所有应用——包括系统本身——都能受到保护。此外,广告拦截方法通常还可以扩展,用于防御跟踪器和其他类型的恶意软件。 ## 基本原理 据我所知,所有系统级广告拦截方法都是通过覆盖 DNS 行为来实现的。DNS(域名服务)是将主机名映射为数字 IP 地址的技术;DNS 查询几乎是所有网络操作的第一步。 通过 DNS 拦截广告,本质上就是找到已知广告服务的主机名,并将它们映射到虚假的 IP 地址。这可以在 Android 手机本地完成,也可以在某个外部 DNS 服务器上完成。 返回虚假的 IP 地址并不能阻止某个应用或浏览器*尝试*展示广告,也不能让它们更好地利用广告所占用的屏幕空间。不同的应用对广告展示失败的反应各不相同——这一点稍后再谈。 ## 通过 DNS 拦截广告 通过修改 DNS 来拦截广告,基本上有四种方法: 1. 使用具备广告拦截功能的商业 DNS 服务 2. 使用具备广告拦截功能的商业虚拟专用网络(VPN),例如 NordVPN (https://nordvpn.com/) 3. 安装一款不需要 root 权限的广告拦截应用 4. 使用需要 root 权限的广告拦截方法,可以搭配或不搭配辅助应用 一般来说,当 Android 设备连接到互联网时,DNS 名称解析(将主机名映射为数字互联网地址)是由手机运营商或互联网服务提供商托管的服务器来执行的。 Android 允许你覆盖这种行为,选择一个能够拦截广告的自定义 DNS 服务器。当然,它并不会真正"拦截"任何东西——严格来说并非如此;DNS 服务器只是在你的手机查询某个已知广告商主机名所对应的 IP 地址时,返回一个虚假的 IP 地址。 具体你能对拦截内容有多少控制权,取决于你使用的是哪种 DNS 服务。例如,一些用户出于儿童保护的考虑,选择同时屏蔽色情或在线赌博网站的访问。 这些服务的效果如何,当然取决于服务运营方对其已知广告主机名单的维护质量。广告服务不断出现和消失,即便是长期存在的服务也会时不时更换服务器。 目前支持广告拦截的商业 DNS 服务有很多,我不专门推荐任何一家。价格各不相同,大多数服务都提供免费试用。如果你重视隐私,你可能希望使用不留日志的服务,或许还希望选择支持加密 DNS 的服务。不怀好意的 DNS 运营方可能通过各种方式获取敏感数据。例如,DNS 运营方有可能将你在线银行服务的请求导向其自己的代理,然后在你登录时窃取你的凭据。你一定要非常谨慎——虽然也有合法的免费 DNS 服务,但对于任何资金来源不明确的此类服务,我都相当怀疑。 对许多人来说,这将是最简单的解决方案。如果你出于一般的隐私保护订阅了 VPN 服务,拦截广告通常不需要额外花费。支持广告拦截的 VPN 通常会将 DNS 查询重定向到自己的服务器,并为已知广告商返回虚假的 IP 地址,就像商业 DNS 服务一样。因此,VPN 与广告拦截 DNS 服务具有相同的优缺点。大型 VPN 运营方通常会提供一款 Android 应用来配置手机使用其服务器,所以对大多数人来说,设置过程非常简单。 与商业 DNS 服务一样,不怀好意的 VPN 运营方可能非常危险,因此谨慎选择服务商非常重要。 据我所知,所有这些应用利用的都是 Android 平台封闭策略中的一个(某种意义上的)漏洞。 与所有基于 Linux 的操作系统一样,Android 提供了一种方式,让设备覆盖其互联网服务提供商所使用的 DNS 映射。手机上某个地方会有一个文件,其中包含一份优先名称到 IP 映射的列表。在未 root 的 Android 设备上,用户没有权限修改这个文件,因此一种简单的广告拦截方法——在文件中为已知广告商维护虚假的 DNS 映射列表——就无法使用。 然而,在未 root 的设备上,你*可以*安装 VPN 服务。如果 Android 要支持 VPN,这一点必须可行。一款未 root 的广告拦截应用通常会运行一个 DNS 服务器和一个本地(应用内)VPN 主机。该应用会将手机配置为使用其自身的 VPN 作为系统 VPN 提供方,从而使其自身的 DNS 服务器成为系统 DNS。掌握了 DNS 之后,应用就能自行处理名称查询,包括那些已知广告服务器的查询。 Google 作为一家广告公司,对这类做法并不太感兴趣。虽然它无法在不完全毁掉 VPN 功能的前提下轻易阻止"本地"VPN 的使用,但 Google 可以、也确实会让非技术用户难以获取到合适的应用。目前,你可以从 F-Droid (https://f-droid.org/) 等第三方应用商店获取 AdAway 这样的应用。 Google 也决意让这变得困难。用不了多久,你可能就得从(希望是)信誉良好的来源获取应用的 APK 文件,并在 Google 为安装其不喜欢的软件设置的各种障碍面前折腾一番。在撰写本文时,Google 还没有完全禁止从其 Play 商店之外安装软件,但难度正越来越大。 不过,Google 的阻碍可能永远不会像给 Android 手机 root 并应用一个一劳永逸的广告拦截方案那样难以克服。使用 AdAway 这样的应用,即使 Google 让安装变得困难,它很可能仍比商业 DNS 或 VPN 服务更有优势。 最明显的优势是这些应用通常免费使用。尽管如此,志愿者维护者组成的社区确保了这些应用的已知广告商名单和商业服务提供的名单一样详尽。但缺点是,手机上所有应用的所有网络流量都必须经过单个应用的转发。这不仅会形成网络瓶颈,一个恶意的广告拦截应用和一个恶意的 VPN 服务一样危险。幸运的是,由于这些广告拦截应用通常是开源的,恶意行为者的可乘之机有限。我强烈建议不要使用*非*开源的应用,即使你不打算自己查看源代码。 如果你的手机已经 root,那么广告拦截就很简单了——至少理论上如此。Android 的优先名称到 IP 映射列表位于 `/system/etc/hosts` 文件中,你只需编辑该文件,将广告商的主机名指向一个虚假的 IP 地址。通常是手机自身的本地 IP 地址 `127.0.0.1`。于是你会得到一个像这样的 `hosts` 文件: ``` 127.0.0.1 08.185.87.0.liveadvert.com 127.0.0.1 08.185.87.00.liveadvert.com ... ``` 使用手机本地 IP 地址的原因是,它必须对应一个手机实际可达的系统。否则,当应用尝试联系不可达的广告主机时,网络访问将会严重延迟。当然,这意味着对广告服务的每次请求都会被导回手机本身,而手机会向发起请求的应用返回一个错误响应。由于请求会立即失败,这种回环网络路由不会给手机带来明显的负担。 这一切在理论上都很简单明了,但在实践中存在两个主要问题。 首先,我们需要一个需要屏蔽的主机名来源。这些主机名列表在网站上随处可见,但维护问题始终存在。其中一些列表确实非常庞大,而且毫无疑问包含了已不再运营的主机。如果主机名列表这么长,那么所有网络访问都会变慢,因为手机在每次 DNS 查询时都要解析 `hosts` 文件。 广告拦截 `hosts` 文件最好的来源,可能是 AdAway 等开源广告拦截应用的代码。事实上,当 AdAway 安装在已 root 的手机上时,它可以自动提供其名单,从而简化设置过程。 第二个问题是,你*不能*直接随意修改 `hosts` 文件,即使以 `root` 身份也不行——在所有现代 Android 设备上,它位于一个只读文件系统中。因此,你需要某个软件在启动过程中、系统目录仍然可写的时候,修改 `/system` 目录中的内容。 如果你已经给手机 root 了,那么你几乎肯定已经有办法做到这一点。例如,如果你使用 Magisk,可以利用一个模块来提供新的 `hosts` 文件。Magisk 模块位于 `/data/adb/modules` 下的目录中,模块自身 `system` 目录中的任何文件都会在启动时覆盖主 `/system` 目录中的对应文件。因此,你可以创建一个 Magisk 模块,提供其自己的 `/system/etc/hosts` 文件。 值得庆幸的是,Magisk 用户不必手动完成这些操作,因为 Magisk 开发者已经预见到了这种用法。如果你在 Magisk 应用中启用"systemless hosts"选项,它就会创建必要的模块,并将所有必要的元数据放置到位。之后,要创建自定义 `hosts` 文件,你只需以 `root` 身份修改 `/data/adb/modules/root/system/etc/hosts`,然后重启即可。或者,你也可以使用应用来完成这一更改。 事实上,由于这种修改 `hosts` 文件的方法如此普遍,像 AdAway 这样的广告拦截应用已经内置了对它的支持;当然,这种支持仅适用于已 root 的设备。如果你的手机已经 root,使用一款支持 root 的广告拦截应用可能是管理广告最有效的方式。它比安装本地模拟 VPN 的非 root 应用快得多,也不会引发相同的安全担忧。这并不是说*没有*任何隐忧,理想情况下你应该检查此类应用安装的 `hosts` 文件,确保其中没有映射到 `127.0.0.1` 以外的任何地址。 需要明白的是,没有任何广告拦截方法是完全可靠的,或者不会产生副作用。 最值得注意的是,某些 Android 应用没有广告就无法正常工作,或者工作不正常。如果你必须使用这类应用,就需要一种允许你自定义被拦截网站列表的广告拦截方法。仅凭应用本身的行为,是完全看不出它为什么不工作、以及该如何修复的。在已 root 的手机上,你可以详细跟踪某个特定应用的网络行为,理论上弄清楚它需要什么而你拦截了什么。在实践中,更简单的做法是查阅这些应用的在线讨论,因为很可能已经有人做过这项工作了。 然而,有些应用甚至将所有广告都内置其中;任何广告拦截器都无法阻止这类应用展示广告,因为其中不存在需要拦截的网络操作。 还需要明白的是,Android 会在各个位置缓存 DNS 查询。虽然某些广告拦截方法允许实时配置被拦截的主机名列表,但你可能仍然需要重启手机以清除其缓存。 虽然这一点应该显而易见,但请记住,基于 DNS 的广告拦截只在应用使用 DNS 时才有效。由于基于 DNS 的广告拦截如此普遍,一些应用开发者正在实现直接通过 IP 地址访问广告服务的方式,这使得所有基于 DNS 的方法都失效了。幸运的是,这种情况目前仍然相对少见。 能够在系统层面拦截广告,是 2026 年让你给 Android 手机 root 的少数令人信服的理由之一。通过这种方式拦截广告几乎不(或根本不)需要额外的系统资源,而且其效果覆盖所有应用。 如果你无法给设备 root,或者不愿意这样做,还有其他方法可以拦截广告,但没有一种像这样有效、可配置且廉价。 最后,如果你主要是在网站上而不是在应用中受广告困扰,最简单的方法可能是安装一款支持广告拦截的网络浏览器,完全避免系统级广告拦截。 *如果你针对本页发布了相关回应,请随时向我发送 webmention (https://kevinboone.me/webmention.html),并附上引用本页的博客或页面的 URL。*

相似文章

Android 可能很快限制设备端 ADB

Hacker News Top

Android 可能很快限制设备端 ADB 连接以提升安全性,这可能会影响像 Shizuku 这样的工具,以及依赖回环 ADB 进行调试和通话录音的开发者。