Skip to content

Latest commit

 

History

History
149 lines (112 loc) · 5.11 KB

README.zh-cn.md

File metadata and controls

149 lines (112 loc) · 5.11 KB

AdblockAndroid

English | 简体中文

一个轻量级、高性能、为安卓量身打造的 adblock 过滤引擎依赖库,支持 EasyListAdGuard Filters 的过滤规则。

底层的算法实现基于 brave/ad-block,在将其适配到安卓平台之外,我还修复了几个致命的错误(d85d341583f87a)、使安装规则的性能提升了40倍(ab18236a0009c8),并实现了许多新的特性。

特性

技术栈

  • Android
  • Kotlin
  • C++
  • JavaScript
  • JNI

示例

请查看 releasesapp/src里的代码。

快速上手

注意:本教程要求阅读者有基本的WebView开发经验

注意:完整的示例应用可查看 :app 模块

1. Gradle 配置

在项目根目录的 build.gradle 添加仓库地址:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

在具体模块添加依赖:

dependencies {
    implementation 'com.github.Edsuns.AdblockAndroid:ad-filter:1.0'
}

2. 代码

添加以下代码到 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)
        })
    }
}

大功告成!

致谢