English | 简体中文
一个轻量级、高性能、为安卓量身打造的 adblock 过滤引擎依赖库,支持 EasyList 和 AdGuard Filters 的过滤规则。
底层的算法实现基于 brave/ad-block,在将其适配到安卓平台之外,我还修复了几个致命的错误(d85d341,583f87a)、使安装规则的性能提升了40倍(ab18236,a0009c8),并实现了许多新的特性。
- 所有来自 brave/ad-block 的特性
- 支持 element hiding
- 支持 Extended CSS selectors
- 支持 CSS rules
- 支持 Scriptlet rules
- 支持 checksum
- 支持在后台下载和安装
- 支持订阅过滤列表
- 支持自定义过滤规则
- Android
- Kotlin
- C++
- JavaScript
- JNI
请查看 releases 和 app/src
里的代码。
注意:本教程要求阅读者有基本的WebView开发经验
注意:完整的示例应用可查看 :app
模块
在项目根目录的 build.gradle 添加仓库地址:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
在具体模块添加依赖:
dependencies {
implementation 'com.github.Edsuns.AdblockAndroid:ad-filter:1.0'
}
添加以下代码到 Application
类
class App : Application() {
override fun onCreate() {
super.onCreate()
// Debug配置
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
// 启动过滤器
val filter = AdFilter.create(this)
}
}
添加以下代码到 WebChromeClient
类
class WebClient(private val webViewClientListener: WebViewClientListener) : WebViewClient() {
private val filter = AdFilter.get()
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse? {
val result = filter.shouldIntercept(view!!, request!!)
return result.resourceResponse
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
filter.performScript(view, url)
}
}
添加以下代码到 Activity
类
class MainActivity : AppCompatActivity(), WebViewClientListener {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val filter = AdFilter.get()
val filterViewModel = filter.viewModel
// 为WebView安装过滤器
filter.setupWebView(binding.webView)
// 在首次安装时添加订阅并下载
if (!filter.hasInstallation) {
val map = mapOf(
"AdGuard Base" to "https://filters.adtidy.org/extension/chromium/filters/2.txt",
"EasyPrivacy Lite" to "https://filters.adtidy.org/extension/chromium/filters/118_optimized.txt",
"AdGuard Tracking Protection" to "https://filters.adtidy.org/extension/chromium/filters/3.txt",
"AdGuard Annoyances" to "https://filters.adtidy.org/extension/chromium/filters/14.txt",
"AdGuard Chinese" to "https://filters.adtidy.org/extension/chromium/filters/224.txt",
"NoCoin Filter List" to "https://filters.adtidy.org/extension/chromium/filters/242.txt"
)
for ((key, value) in map) {
val subscription = filterViewModel.addFilter(key, value)
filterViewModel.download(subscription.id)
}
}
filterViewModel.onDirty.observe(this, {
// 在过滤器有变更时清除缓存,需要手动刷新网页使变更生效
binding.webView.clearCache(false)
})
}
}
大功告成!