# libadblockplus-android
**Repository Path**: liuzc/libadblockplus-android
## Basic Information
- **Project Name**: libadblockplus-android
- **Description**: Android JNI bindings for libadblockplus
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2019-07-19
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Adblock Android SDK
================================
An Android library project, tests, settings fragments and demo application for AdblockWebView.
## Updating the dependencies
Adblock Android SDK has dependencies that aren't in this repository.
To update those, call:
./ensure_dependencies.py
## Library
An Android library that provides the core functionality of Adblock Plus.
You can find it in the 'adblock-android' directory.
### Using as a Gradle dependency
Make sure you have `jcenter()` in the list of repositories and then add the following dependency:
```groovy
dependencies {
implementation 'org.adblockplus:adblock-android:3.0'
}
```
In general case it's suggested to use the most recent version.
### Building
#### Requirements
* [The Android SDK](https://developer.android.com/sdk)
* Android SDK Build tools 28.0.3
* [The Android NDK, 16b](https://developer.android.com/ndk)
Edit 'buildToolsVersion' in 'build.gradle' files if necessary.
#### Building of libadblockplus
First, make sure all the [prerequisites](https://gitlab.com/eyeo/adblockplus/libadblockplus/blob/master/README.md#supported-target-platforms-and-prerequisites) are installed.
Second, one needs to build `V8` required for `libadblockplus`.
See `libadblockplus/README` or V8 documentation on how to build V8 or
fetch precompiled one. For the latter, run in 'libadblockplus' directory:
make TARGET_OS=android ABP_TARGET_ARCH=arm Configuration=release get-prebuilt-v8
make TARGET_OS=android ABP_TARGET_ARCH=arm64 Configuration=release get-prebuilt-v8
make TARGET_OS=android ABP_TARGET_ARCH=ia32 Configuration=release get-prebuilt-v8
Make sure to set `ANDROID_NDK_ROOT` environment variable to point to Android NDK installation, eg.:
export ANDROID_NDK_ROOT=/Users/developer/ndk/android-ndk-r16b
After that we can build `libadblockplus`:
make TARGET_OS=android ABP_TARGET_ARCH=arm Configuration=release
make TARGET_OS=android ABP_TARGET_ARCH=arm64 Configuration=release
make TARGET_OS=android ABP_TARGET_ARCH=ia32 Configuration=release
#### Building from command-line
In the project root directory create the file _local.properties_ and set
_sdk.dir_ and _ndk.dir_ to where you installed it, e.g.:
sdk.dir = /some/where/sdk
ndk.dir = /some/where/ndk
In the project root directory run:
./gradlew assembleDebug
This will generate *.aar artifacts in the '.../build/outputs/aar/' directories:
* adblock-android-abi_all-... - AAR for all the ARCHs (x86, armv7a, arm64)
* adblock-android-abi_x86-... - AAR for x86 only
* adblock-android-abi_arm-... - AAR for armv7a only
* adblock-android-abi_arm64-... - AAR for arm64 only
* adblock-android-webview-... - AAR for AdblockWebView
* adblock-android-settings-... - AAR for Settings
**Android permissions note**
An app that uses the library have to add the following permissions to `AndroidManifest.xml`:
* ``
* ``
* ``
(added automatically if building with Gradle or should be added manually otherwise).
### Build directory configuration
By default Gradle uses `build` directory to build modules, however it can be undesired
for some use cases like CI or building as Chromium submodule.
Set `GRADLE_BUILD_DIR` environment variable to configure build directory:
GRADLE_BUILD_DIR=/tmp ./gradlew clean assemble
Note
[Configuration] Building project in /tmp
output while building
### Building with prebuilt shared V8
This can be desired to use product's V8 (let's say Chromium) instead of built-in V8.
Put prebuilt shared V8 library file(s) in ARCH directories and set `SHARED_V8_LIB_FILENAMES`
environment variable and `SHARED_V8_LIB_DIR` before building.
You can pass multiple filenames in `SHARED_V8_LIB_FILENAMES`, separated with space.
Libadblockplus is required to be linked with that library file(s).
For example:
SHARED_V8_LIB_FILENAMES=libv8.cr.so SHARED_V8_LIB_DIR="/tmp/shared_v8" ./gradlew clean assembleAbi_arm
or
SHARED_V8_LIB_FILENAMES="libv8.cr.so libv8_libbase.cr.so libv8_libplatform.cr.so" SHARED_V8_LIB_DIR="/tmp/shared_v8" ./gradlew clean assembleAbi_arm
for multiple library files.
Note
[Configuration] Excluding shared v8 library libv8.cr.so from AAR
...
[Configuration] Linking dynamically with shared v8 library /tmp/shared_v8/release/libv8.cr.so
...
output while building.
### Building with exposing of libadblockplus classes
Set `EXPOSE_LIBABP_OBJECTS` environment variable to expose libadblockplus classes in shared library.
For example:
EXPOSE_LIBABP_OBJECTS=y ./gradlew clean assembleAbi_arm
### JNI adjustments
In order to load custom library name pass `LIBABP_SHARED_LIBRARY_NAME` environment variable (without `lib` and `.so`):
LIBABP_SHARED_LIBRARY_NAME=adblockplus ./gradlew assembleRelease
In order to skip compilation of JNI classes pass `SKIP_JNI_COMPILATION` environment variable:
SKIP_JNI_COMPILATION=true ./gradlew assembleRelease
### Building for single ARCH
By default adblock-android is built for both ARM and x86 and it can be filtered when
building end-user android application. However sometimes it can be desired to build
"adblock-android.aar" for single ARCH.
Pass `abi_arm`, `abi_arm64` or `abi_x86` to build it for single arch or `abi_all` for all ARCHs:
`./gradlew clean assembleAbi_arm`
Note
[Configuration] Using adblock-android ABI flavor: abi_arm
output while building.
## SDK tests
### Pure java tests
You can find pure Java tests in 'src/test' directories of the modules (if provided).
In the project directory run:
./gradlew test
You can select test class/method and click 'Run ..Test'.
No Android emulator/device running required.
### Android tests
You can find Android tests in 'src/androidTest' directories of the modules (if provided).
In the project directory run:
./gradlew connectedAbi_x86DebugAndroidTest
to test with x86 device/emulator or run:
./gradlew connectedAbi_armDebugAndroidTest
to test with ARM device/emulator.
You can select test class/method and click 'Run ..Test'.
## Settings
An Android library that provides a configuration interface for Adblock Plus.
You can find it in the 'adblock-android-settings' directory:
* GeneralSettingsFragment - main fragment
* WhitelistedDomainsSettingsFragment - whitelisted domains fragment
### Using as a Gradle dependency
Make sure you have `jcenter()` in the list of repositories and then add the following dependency:
```groovy
dependencies {
implementation 'org.adblockplus:adblock-android-settings:3.0'
}
```
In general case it's suggested to use the most recent version.
### Usage
Create `AdblockEngineProvider` instance and `AdblockSettingsStorage` instance.
You can use `SharedPrefsStorage` implementation to store settings in `SharedPreferences`.
Or you can use AdblockHelper:
AdblockHelper
.get()
.init(this, getFilesDir().getAbsolutePath(), true, AdblockHelper.PREFERENCE_NAME);
// optional - provide preloaded subscription files in app resoruces
.preloadSubscriptions(AdblockHelper.PRELOAD_PREFERENCE_NAME, map);
Make sure you initialize it once during app launch, call `isInit()` to check it:
if (!AdblockHelper.get().isInit())
{
// requires initialization
...
}
Sometimes it's desired to initialize or deinitialize FilterEngine instance
when created:
AdblockHelper
.get()
.init(...)
.addEngineCreatedListener(engineCreatedListener)
or disposed:
AdblockHelper
.get()
.init(...)
.addEngineDisposedListener(engineDisposedListener)
Implement the following interfaces in your settings activity:
* `BaseSettingsFragment.Provider`
* `GeneralSettingsFragment.Listener`
* `WhitelistedDomainsSettingsFragment.Listener`
and return created instance or AdblockHelper instances:
AdblockHelper.get().getProvider().getEngine(); // engine
AdblockHelper.get().getStorage(); // storage
Retain Adblock instance in activity `onCreate` in synchronous mode (it may take few seconds):
AdblockHelper.get().getProvider().retain(false);
or in asynchronous mode (without current thread lock):
AdblockHelper.get().getProvider().retain(true);
Invoke `waitforReady` every time you need AdblockEngine instance if retained in asynchronous mode:
AdblockHelper.get().getProvider().waitForReady();
Release Adblock instance in activity `onDestroy`:
AdblockHelper.get().getProvider().release();
Insert `GeneralSettingsFragment` fragment instance in runtime to start showing settings UI.
### Building
In the project root directory run:
./gradlew assemble
This will generate *.aar in the 'adblock-android-settings/build/outputs/aar' directory.
## WebView
An Android library that provides a WebView component with Adblock Plus integrated.
You can find it in the 'adblock-android-webview' directory.
`AdblockWebView` class provides built-in ad blocking
(both resource loading filtering and element hiding) and inherits from Android
['WebView'](https://developer.android.com/reference/android/webkit/WebView.html).
### Using as a Gradle dependency
Make sure you have `jcenter()` in the list of repositories and then add the following dependency:
```groovy
dependencies {
implementation 'org.adblockplus:adblock-android-webview:3.0'
}
```
In general case it's suggested to use the most recent version.
### Usage
In layout XML:
In java source code:
AdblockWebView webView = (AdblockWebView) findViewById(R.id.main_webview);
Use `setAdblockEnabled(boolean adblockEnabled)` to enable/disable adblocking.
Use `setDebugMode(boolean debugMode)` to turn debug log output (Android log and JS console) on/off.
Use `setAllowDrawDelay(int allowDrawDelay)` to set custom delay to start render webpage after 'DOMContentLoaded' event is fired.
Use `setProvider(AdblockEngineProvider provider)` to use external adblock engine provider.
The simplest solution is to use `AdblockHelper` from `-settings` as external adblock engine provider:
webView.setProvider(AdblockHelper.get().getProvider());
If adblock engine provider is not set, it's created by AdblockWebView instance automatically.
Use `setSiteKeysConfiguration(..)` to support sitekeys whitelisting.
This is optional but highly suggested. See `MainActivity.java` on usage example.
Use `dispose(Runnable disposeFinished)` to release resources (**required**).
Note it can be invoked from background thread.
### Building
In the project root directory run:
./gradlew assemble
This will generate *.aar in the 'adblock-android-webview/build/outputs/aar' directory.
## WebView Application
An Android application that demonstrates how to use AdblockWebView.
You can find it in the 'adblock-android-webviewapp' directory.
### Building
Make sure _Library_ requirements are present.
In the project root directory run:
./gradlew assemble
This will generate *.apk in the 'adblock-android-webviewapp/build/outputs/apk/' directory.