Skip to content

Edsuns/AdblockAndroid

Repository files navigation

AdblockAndroid

English | 简体中文

A lightweight and efficient adblock engine library for Android, which has strong compatibility for filters like EasyList and AdGuard Filters.

The native C++ code is based on brave/ad-block. Beyond adapting it to Android platform, I fixed some fatal issues (d85d341, 583f87a), made 40x better parsing performance (ab18236, a0009c8) and implemented some new features.

Features

Tech Stack

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

Demo

See releases and the code in app/src.

Get Started

Note: This development requires you to have fundamental Android WebView experience.

Note: A full application example can be found in :app module.

1. Gradle Configuration

Add it in your root build.gradle at the end of repositories:

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

Add the dependency:

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

2. Coding

Add the code in your Application class

class App : Application() { override fun onCreate() { super.onCreate() // Debug configuration. if (BuildConfig.DEBUG) { Timber.plant(Timber.DebugTree()) } // Start adfilter. val filter = AdFilter.create(this) } }

Add the code in your WebChromeClient class

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) } }

Add the code in your Activity class

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 // Setup AdblockAndroid for your WebView. filter.setupWebView(binding.webView) // Add filter list subscriptions on first installation. 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, { // Clear cache when there are changes to the filter. // You need to refresh the page manually to make the changes take effect. binding.webView.clearCache(false) }) } }

Congratulations, great success!

Thanks To