Android应用广告过滤几种方式

前言

说起网页广告,那真是让人又恨又爱,它们不但占用了网页的可视控件,分散用户的注意力,还有些浮动广告干扰甚至误导用户操作。但是广告又是开发者重要的收入来源之一,比如我们在做浏览器的同时需要接入新的广告,同时又要过滤掉网页中的广告,这就是一个很正常的现象。说起应用广告过滤对于PC端来说可能更方便,网上有大量各种广告过滤插件。但对于Android等移动端来说就不那么友好了。Android应用的广告过滤方案大概可以分为以下几种方式


Android广告过滤.png

分析

从上图来看,虽然有这几种方式,甚至还有一些方式没有列出来,但其根本可以用一句话来概括:根据规则来过滤URL。其原理可以简单概括如下:

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

  1. 代理方式:
    1.1 服务器方式:对于一个应用如果数据来源于指定的服务器,只需要我们在指定的服务器里控制好资源请求与分发即可,那么对于移动应用来说去广告的效率更好,因为资源的过滤运算均在服务器,而不在移动端,相对来说更可维护,但这样的对服务器的任务又是一个问题了。
    1.2 AdBlockplus: 世界上的网站何止千万,而这些网站的内容又随时都有可能发生变化。因此,AdBlockPlus想出了一个解决方案:通过社区来维护一个规则表,然后根据这个规则表来过滤url,同时让用户自己动手,参与到制作这个规则表的过程中来,以成千上万的用户来对抗千变万化的广告。但是一个app是怎么能够对整个手机的流量进行过滤的呢?其实很简单,AdBlockPlus自动对手机设置了代理,代理到本机的2020端口,然后建立了一个简单的代理服务器,将所有的网络请求都统一通过这个代理来处理,从而达到全局的广告过滤效果。当然,当使用数据流量的时候,需要root权限,在4.0版本以上的wifi下的代理设置,也需要root权限,或者手动进行设置。我们先不管AdBlockPlus的代理服务器那部分功能,只看其核心的部分,也就是下载并读取规则文件,然后根据规则文件来判断url是否应该被过滤。如果你看过其安卓源码,你就会惊讶的发现,里面居然是用jni实现的,再仔细看的话,会发现jni的代码只是封装了静态链接库里面的内容,真正干活的部分都在静态链接库里,至于静态链接库里面的源码,就得装上git,hg,然后按照使用说明,才能同步下来整个代码库。这还不算完,因为估计是为了能跨平台使用,其核心部分代码是用js写的。AdBlockPlus就是通过V8引擎来执行js代码的,而js代码和V8引擎,都先通过交叉编译,被整合到了静态链接库中,最后通过jni封装以后,编译成动态链接库来Android使用。可以说AdBlockPlus的核心就是对规则库的解析和匹配了,所以如果想修改AdBlockPlus的核心代码,则需要修改js、编译V8才行,或者使用java完全重写js代码的内容,而如果只想快速的将AdBlockPlus的广告过滤功能应用到自己的app中,就只能把原封不动的使用现成的模块了。

  2. WebView自处理:
    2.1 shouldInterceptRequest拦截:通过WebViewClient的源代码发现里面有个回调方法WebResourceResponse shouldInterceptRequest(WebView view, String url)这个方法中的url参数可以获取到所有的请求链接,我们需要一个规则文件里面包含大量广告host,每次获取url判断host规则文件中是否包含次链接/js名称/规则,对url进行解析对比判断是否为广告,如果是就对其进行拦截。
    2.2 onPageFinished过滤:既然PC端能够通过js实现广告过滤,那么Android端同样也可以实现,即通过webview调用js脚本即可。

  /**
     * 注入js代码,获取当前页面所有的img
     *
     * @param view WebView
     */
    private void parseHTML(WebView view) {
        view.loadUrl("javascript:function getImgslist() {\n" +
                "  var imgs = document.querySelectorAll(\"body img\");\n" +
                "\n" +
                "  if (imgs && imgs.length <= 0) return \"\";\n" +
                "  var imgsArr = [].slice\n" +
                "    .call(imgs)\n" +
                "    .map(function(el) {\n" +
                "      return el.src;\n" +
                "    })\n" +
                "    .filter(Boolean);\n" +
                "\n" +
                "  return imgsArr;\n" +
                "}\n" +
                "window.local_obj.showSource(getImgslist());");
    }

可在方法onPageFinished 方法中调用该脚本,即可以实现相关功能。

总结

以上为广告过滤在Android中使用的几种方案,简单的概括为:在应用发起请求或者收请求去按照规则过滤相关url。当然广告过滤的方法远不止这几种,如果有其他方式欢迎交流讨论,但规则始终逃不过按照规则过滤url。

一下为AdBlockplus 维护的几个过滤表(过滤强度依次减弱):

https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt
https://easylist-downloads.adblockplus.org/easylistchina.txt
https://adfiltering-rules.googlecode.com/svn/trunk/lastest/rules_for_ABP.txt

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,036评论 1 32
  • 浪淘沙•新农庄揽胜 徐步北庄园,天淡水闲,安恬别墅小窗轩。河枕农家樟掩映,疑似仙藩。 旁路状元坛,林里啼鹃,游玩摘...
    金煊阅读 517评论 1 7
  • 生活已然遵循着黑暗森林法则 我怀着杂糅的情绪在这片森林摸索 不知道自己走了多远 也不清楚前面还有多远 唯一不变的是...
    庇域阅读 725评论 0 3