04月16, 2016

使用AdBlockPlus在App中过滤网页广告

说起网页广告,那真是让人又恨又爱,它们不但占用了网页的可视控件,分散用户的注意力,还有些浮动广告干扰甚至误导用户操作。但是广告又是开发者重要的收入来源之一,同样作为一名开发者,还是挺能理解的。

本文主要是告诉安卓开发者们,如何在你的app中有效的过滤网页广告,大大提高用户的使用体验。产品效果可以参考猎豹手机浏览器和360手机浏览器,有的情况下甚至比这两者的广告过滤效果还要好。

原理

过滤广告很简单,就是判断页面是否有广告,如果有广告,则不加载这条广告。具体就要从网页加载原理说起了,懂的可以跳过这段。我们知道网页其实就是html+css+js,请求网页的时候,会先根据url来下载html文件,并进行解析,解析到需要加载的css和js以及图片视频等资源的时候,就会去下载这些文件。也就是说,每一个文件的下载都对应一条url,打开一个网页,可能需要下载数十上百个文件,也就有这么多的url。所以我们可以针对每一条url进行判断,看其到底是不是会产生广告的url,或者就是广告的资源。

AdBlockPlus

原理我们知道了,但是真的要实现过滤广告仍然很困难,因为世界上的网站何止千万,而这些网站的内容又随时都有可能发生变化。因此,AdBlockPlus想出了一个解决方案:通过社区来维护一个规则表,然后根据这个规则表来过滤url,同时让用户自己动手,参与到制作这个规则表的过程中来,以成千上万的用户来对抗千变万化的广告。

以上就是大名鼎鼎的AdBlockPlus的工作原理,AdBlockPlus是开源项目,包括各种平台上的实现,包括各个浏览器插件、ios、Android。详情见:https://github.com/adblockplus。其中安卓平台上的开源项目是https://github.com/adblockplus/adblockplusandroid,其功能是对整个手机上的广告进行过滤。

通过设置代理过滤全局广告

那你可能就有疑问了,一个app,没有系统级的权限,是怎么能够对整个手机的流量进行过滤的呢。其实很简单,AdBlockPlus自动对手机设置了代理,代理到本机的2020端口,然后建立了一个简单的代理服务器,将所有的网络请求都统一通过这个代理来处理,从而达到全局的广告过滤效果。当然,当使用数据流量的时候,需要root权限,在4.0版本以上的wifi下的代理设置,也需要root权限,或者手动进行设置。

检测广告的核心功能

我们先不管AdBlockPlus的代理服务器那部分功能,只看其核心的部分,也就是下载并读取规则文件,然后根据规则文件来判断url是否应该被过滤。如果你看过其安卓源码,你就会惊讶的发现,里面居然是用jni实现的,再仔细看的话,会发现jni的代码只是封装了静态链接库里面的内容,真正干活的部分都在静态链接库里,至于静态链接库里面的源码,就得装上git,hg,然后按照使用说明,才能同步下来整个代码库。这还不算完,因为估计是为了能跨平台使用,其核心部分代码是用js写的。那你可能又有疑惑,js代码怎么能在Android上运行呢。我也不卖关子了,听说过chrome的V8引擎吧,AdBlockPlus就是通过V8引擎来执行js代码的,而js代码和V8引擎,都先通过交叉编译,被整合到了静态链接库中,最后通过jni封装以后,编译成动态链接库来Android使用。

可以说AdBlockPlus的核心就是对规则库的解析和匹配了,所以如果想修改AdBlockPlus的核心代码,则需要修改js、编译V8才行,或者使用java完全重写js代码的内容,而如果只想快速的将AdBlockPlus的广告过滤功能应用到自己的app中,就只能把原封不动的使用现成的模块了。

我将其中核心的部分提取出来,就可以很简单的使用了。使用方法看demo就知道了,只要几行代码,就能实现类似甚至超越猎豹手机浏览器、360手机浏览器的广告过滤效果。

如果以后有时间了,学习一下js,然后把这部分核心代码用java或者C实现出来,这样就不需要那个6m大的动态链接库了,因为里面主要都是V8的东西。

源码

下面是项目地址:https://github.com/l465659833/ADBlocker

本文链接:http://www.siki.space/post/use_adblock_in_your_app.html

-- EOF --

Comments