Build System
Omni builds with the Gradle Kotlin DSL, Android Gradle Plugin 9.1 and Kotlin 2.2. This page takes you from a fresh clone to a signed APK.
Prerequisites
| Tool | Version |
|---|---|
| Android Studio | Ladybug or newer |
| JDK | 17 |
| Android SDK | compileSdk 36, minSdk 26 |
| Device / emulator | Android 8.0+ (API 26) |
Build and run
# Clone
git clone https://github.com/REBEL-ROOT/omni-browser.git
cd omni-browser
# Debug build (runs on connected device / emulator)
./gradlew :app:installUniversalDebug
# Release APKs for all ABIs
./gradlew :app:assembleRelease
ABI product flavors
GeckoView ships per-ABI native libraries, so Omni defines three flavors in a single abi dimension. Each gets a versionCode offset so the Play Store can serve the right one:
| Flavor | ABI | versionCode offset |
|---|---|---|
universal | all | +1,000,000 |
arm | armeabi-v7a | +2,000,000 |
aarch64 | arm64-v8a | +3,000,000 |
With a base versionCode of 2030, the aarch64 release of v1.2.6.4 is 3002030.
Release configuration
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true // R8 full mode
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
signingConfig = signingConfigs.getByName("release")
// Native debug symbols for Play Console
ndk { debugSymbolLevel = "SYMBOL_TABLE" }
}
}
- R8 full mode + resource shrinking keep the executable lean.
- Native debug symbols are exported for crash symbolication without shipping them in the APK.
- Signing uses
release-new.keystore; credentials come fromlocal.propertiesor environment variables (CI uses GitHub Secrets — the keystore was purged from history).
The GeckoView dependency
GeckoView comes from Mozilla’s content-filtered Maven repository, pinned per ABI:
maven {
url = uri("https://maven.mozilla.org/maven2")
content { includeGroupByRegex("org\\.mozilla\\.geckoview.*") }
}
// per-ABI artifacts + a universal artifact
implementation("org.mozilla.geckoview:geckoview-omni:145.0.20251124145406")
The build also explicitly excludes io.opencensus to avoid pulling in a telemetry-flagged dependency (relevant for F-Droid).
Continuous integration
Two GitHub Actions workflows drive quality and releases:
pr_check.yml— builds and lints every pull request.release.yml— triggered by av*tag. It verifiesversionCodemonotonicity, builds and signs all three APKs, and uploads them to a draft GitHub Release.
Native libraries must be built with 16 KB memory-page alignment (an NDK requirement for newer devices). See CONTRIBUTING.md for the exact flags.
F-Droid
com.rebelroot.omni.yml at the repo root is the F-Droid build metadata, using AutoUpdateMode by tag. F-Droid builds are reproducible and signed with the F-Droid key.