谈到跳过安卓应用开屏广告,“借助无障碍权限实现模拟点击”似乎已经成为了标准解决方案,无论是很受欢迎的李跳跳,还是类似的轻启动、蹦跶,都是如此,并以“无需ROOT”作为卖点;此方案虽然通用有效,但是其最大问题是必须保持无障碍权限开启,而在当前国内各大厂商魔改UI的逻辑中,无障碍权限是应用进程结束便关闭,又需要保活进程……其实,如果你的设备已经ROOT,开屏广告也有更多“跳”法。
在开始下一部分之前,请确保你的设备已经拥有ROOT权限,在手机厂商允许解锁BootLoader的前提下,你可以借助KernelSU或者Magisk很轻松的获取ROOT,具体可用参考我的上一篇文章,此处不再赘述。
比起“借助无障碍权限实现模拟点击”这种需要等待开屏广告加载再自动关闭的方案,ROOT后的解决方案更加彻底——不允许开屏广告加载。至于其具体的实现,又可以分为以下三种方式:
Hosts拦截
Hosts文件是一个没有扩展名的操作系统文件,以表的形式存储了主机名和IP地址的映射关系。Hosts又称host table,译为“主机表”。现代系统中,虽然DNS取代了主机表,但主机表的应用依旧很广。和DNS不同的是,用户可以直接对Hosts文件进行控制。
Hosts文件是大多数系统都存在的一个小型主机表。Hosts文件中包含了本地网络重要的主机名和地址信息,查询Hosts文件得到的结果比通过查询DNS得到的结果优先级更高。
——摘自维基百科-Hosts文件
此方案就是借助Hosts解析的结果优先于DNS解析的结果,通过将广告内容加载域名“解析”到不存在的地址上,是的广告内容无法加载。如果你的路由器支持刷入OpenWrt,也完全可以借助AdGuard Home或者Pi-hole将广告拦截于家庭网络之外。而在安卓上,AdAway和AdGuard Android均能实现此功能,并且还提供了不需要ROOT权限的VPN模式,不过此模式会更加耗电,并且与一些特殊工具软件冲突,我个人仅推荐使用ROOT模式。
我使用的是开源免费的AdAway配合10007规则(针对国内广告提供商并且整合了多个不同来源规则,真正All in One)
注意:如果你的ROOT方案为KernelSU,请根据此issue的反馈安装systemless hosts模块,否则AdAway无法在ROOT模式下工作。
开启之后,很多借助广告联盟SDK加载的广告就消失了,但是和应用内容使用相同域名加载的广告仍然存在——目前暂未实现解密SSL流量来去除广告(此方法需要安装根证书,存在极大安全隐患),这也是为什么路由器上的去广告插件效果总是比不上浏览器上的去广告插件。
Activity劫持
Activity 类是 Android 应用的关键组件,而 Activity 的启动和组合方式则是该平台应用模型的基本组成部分。在编程范式中,应用是通过 main() 方法启动的,而 Android 系统与此不同,它会调用与其生命周期特定阶段相对应的特定回调方法来启动 Activity 实例中的代码。
——摘自Activity 简介 | Android开发者
简单来讲,Activity劫持本质上是“移花接木”,将开屏广告的Activity替换为主页面的Activity,直接绕过了开屏广告的加载。事实上,在Thanox和爱玩机工具箱中,此功能确实名为“移花接木”(在上述两款软件中均为付费功能)。
不过,此方法也有两个“小”问题:
- 没有云规则分享,只能自己编写规则(其实不难)或者导入酷安论坛上他人分享的规则(可能并不全面,或者含有未安装应用、已经过时的规则,管理不太方便)
- 一些很鸡贼的厂商将开屏广告合并到了主Activity使此方法失效,上图中,我其实是将百度贴吧直接劫持到了搜索页面……
不过,作为Hosts去广告的有益补充,两者结合基本上已经达到乃至超越了李跳跳的效果,基本上可以用这种更彻底的方案取代李跳跳了。
广告文件替换
此方法是查找资料是意外发现的“Plan C”,大圣净化和Dir均有实现,思路均为就是找到广告文件后用同名的空文件夹替换,来达到去广告的目的。
不过由于不太喜欢大圣净化还需要注册账号的付费机制,久未更新的Dir也无法在我的设备上使用,我并未实际测试此方案,因此效果未知。
以上就是我个人所知道的ROOT后去开屏广告方案,如果有问题或者建议,欢迎一起交流探讨~
非常感谢,看到的最有用的文章。真的成功了。
山中老人 08-16
站在今天的角度看,李跳跳复活了
小小的小 03-13
当时写这篇文章的时候还没有想到李条条等一众工具会被“保护用户福祉”为由下架……
好在现在开源的GKD等项目已经扛起大旗继续走了。
不过在互联网企业的盈利结构发生根本性改变之前,商业广告和去广告技术的攻防战还会继续。
alpacabro 03-14 回复 @小小的小