AmniShield is a privacy-first digital wellness and content-blocking app for Android. It combines app blocking, keyword filtering, focus mode, scheduled blocking, and launch limits into a single accessibility-service–based guardian.
- Requirements
- Building the App
- Product Flavors
- Android Studio Setup
- If the Build Shows Old UI
- Release Builds
- Project Documentation
| Tool | Version |
|---|---|
| Android Studio | Meerkat or newer |
| Gradle | 9.5+ (managed by wrapper) |
| Android SDK compile target | API 36 |
| Min Android version | API 26 (Android 8.0) |
| JDK | 17 |
⚠️ Important — Product Flavors: AmniShield uses three product flavors (playstore,fdroid,universal). The plainassembleDebugGradle task is no longer valid. Always use a flavor-qualified task. Running bareassembleDebugwill silently serve a stale cached APK with old UI and themes.
# Build all three flavors at once (recommended)
.\gradlew assemblePlaystoreDebug assembleFdroidDebug assembleUniversalDebug
# Or build individually
.\gradlew assemblePlaystoreDebug # Google Play Store flavor
.\gradlew assembleFdroidDebug # F-Droid / offline license flavor
.\gradlew assembleUniversalDebug # Universal / sideload flavorAPK output paths:
| Flavor | APK Location |
|---|---|
| playstore | app/build/outputs/apk/playstore/debug/app-playstore-debug.apk |
| fdroid | app/build/outputs/apk/fdroid/debug/app-fdroid-debug.apk |
| universal | app/build/outputs/apk/universal/debug/app-universal-debug.apk |
| Flavor | Description | Google Services | Billing |
|---|---|---|---|
playstore |
Google Play Store distribution | ✅ Firebase, Play Billing | Play Billing |
universal |
Sideload / alternative stores | ✅ Firebase | Play Billing |
fdroid |
F-Droid / fully open source | ❌ No Google dependencies | Offline ECDSA license |
Each flavor has its own source set under app/src/<flavor>/java/ for swapping
billing and sign-in implementations without #ifdef-style hacks.
- Open the project root in Android Studio.
- Open the Build Variants panel (
View → Tool Windows → Build Variants). - Set the Active Build Variant for
:appto one of:playstoreDebugfdroidDebuguniversalDebug
- Hit Run ▶ as normal.
If the Build Variants panel shows just
debug(no flavor prefix), the IDE has not yet synced the new flavor configuration. Run File → Sync Project with Gradle Files to fix it.
If you see the legacy purple gradient background, old DeenShield icons, or the old Settings bottom-nav tab instead of the new Blocks tab, the Gradle build cache is serving a stale APK. Fix it by doing a clean build:
# Step 1: Wipe all build outputs and cached intermediates
.\gradlew clean --no-daemon
# Step 2: Rebuild fresh (--no-daemon forces a new JVM, bypassing any stale cached daemon)
.\gradlew assemblePlaystoreDebug assembleFdroidDebug assembleUniversalDebug --no-daemonThe --no-daemon flag is the key — without it, Gradle may reuse an old daemon process
pinned to a previous Gradle version that has incorrect cached fingerprints.
| Flavor | Published to | Audience |
|---|---|---|
universal |
✅ GitHub Releases | Standard Android — sideloading with Google Play Services |
fdroid |
✅ GitHub Releases | De-Googled phones (GrapheneOS, CalyxOS, LineageOS without GMS) |
playstore |
✅ Play Console only | Google Play Store users — never published to GitHub |
universalandfdroidare not interchangeable. Theuniversalflavor depends on Google Play Services for billing and sign-in. Users on de-Googled ROMs must use thefdroidAPK, which has zero Google dependencies and uses offline ECDSA licensing instead.
The release.yml workflow fires automatically when you push a version tag. It builds, signs, and publishes both APKs to GitHub Releases:
# Tag a release (triggers the workflow)
git tag v1.2.3
git push origin v1.2.3For Self Build:
# GitHub Releases (the two public APKs)
.\gradlew assembleUniversalRelease
.\gradlew assembleFdroidRelease
# Play Store (submitted via Play Console, not GitHub)
.\gradlew assemblePlaystoreReleaseNever commit
keystore.propertiesor.jksfiles to version control. These are already listed in.gitignore.
| File | Description |
|---|---|
| ARCHITECTURE.md | System architecture, blocker pipeline & logging invariants |
| ROADMAP.md | Feature roadmap and recent changelog |
| TESTING_GUIDE.md | Full manual test scenarios for all features |
| PRIVACY_POLICY.md | App privacy policy |
| TERMS_OF_SERVICE.md | Terms of service |
| FDROID_PUBLISHING_GUIDE.md | Steps to publish on F-Droid |
For historical reasons (AmniShield was rebranded from DeenShield), there is a mismatch in the project identifiers:
applicationId:com.alhaq.deenshieldnamespace:com.alhaq.amnishield
Because the Google Play Store registry binds permanently to the applicationId, changing it would require publishing a completely new listing. Consequently, we maintain the legacy applicationId (com.alhaq.deenshield) to avoid disrupting existing users, while codebase packages and code structures use the modern namespace com.alhaq.amnishield. Do not change the applicationId when making code updates.
- Curbox by Nethical (GPL-3.0-or-later): Reel & short-form video surface detection patterns and floating WindowManager overlay mechanics are inspired by Curbox.
This project is licensed under the GNU General Public License v3.0. See LICENSE for the full text.