1. 程式人生 > >使用AdBlockPlus在App中過濾網頁廣告

使用AdBlockPlus在App中過濾網頁廣告

說起網頁廣告,那真是讓人又恨又愛,它們不但佔用了網頁的可視控制元件,分散使用者的注意力,還有些浮動廣告干擾甚至誤導使用者操作。但是廣告又是開發者重要的收入來源之一,同樣作為一名開發者,還是挺能理解的。

本文主要是告訴安卓開發者們,如何在你的app中有效的過濾網頁廣告,大大提高使用者的使用體驗。產品效果可以參考獵豹手機瀏覽器和360手機瀏覽器,有的情況下甚至比這兩者的廣告過濾效果還要好。

過濾廣告很簡單,就是判斷頁面是否有廣告,如果有廣告,則不載入這條廣告。具體就要從網頁載入原理說起了,懂的可以跳過這段。我們知道網頁其實就是html+css+js,請求網頁的時候,會先根據url來下載html檔案,並進行解析,解析到需要載入的css和js以及圖片視訊等資源的時候,就會去下載這些檔案。也就是說,每一個檔案的下載都對應一條url,開啟一個網頁,可能需要下載數十上百個檔案,也就有這麼多的url。所以我們可以針對每一條url進行判斷,看其到底是不是會產生廣告的url,或者就是廣告的資源。

原理我們知道了,但是真的要實現過濾廣告仍然很困難,因為世界上的網站何止千萬,而這些網站的內容又隨時都有可能發生變化。因此,AdBlockPlus想出了一個解決方案:通過社群來維護一個規則表,然後根據這個規則表來過濾url,同時讓使用者自己動手,參與到製作這個規則表的過程中來,以成千上萬的使用者來對抗千變萬化的廣告。

那你可能就有疑問了,一個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