Know when your app is running somewhere it shouldn't.
AppGuard is an Android library that detects repackaging, root, emulators, attached debuggers and hooking frameworks — and lets you decide, per check, whether that is fine, worth reporting, or a reason to stop.
Three answers, not two
Most integrity libraries give you a boolean: the check runs or it doesn't. That forces an awkward choice, because the conditions worth detecting in production — an attached debugger, an emulator — are the everyday conditions of development. AppGuard makes the response a per-check, per-build-type decision.
ALLOWED
The check does not run. Nothing detected, nothing emitted, no runtime cost. For what is normal in a given build.
WARNING
Runs and publishes an event keyed by check. Your app logs it, reports it, or degrades a feature — and keeps running.
ENFORCED
Publishes the event, then throws and terminates the process. For the build that ships.
What it checks
| Signature | The APK signing certificate is not whitelisted — the app has been repackaged. |
|---|---|
| Root | RootBeer signals, Magisk installed or running, permissive SELinux. |
| Hooking | Frida, Xposed and similar instrumentation, detected from Kotlin and from native code. |
| Debugger | A Java or native debugger attached, or the build flagged debuggable. Claims the ptrace slot at startup when enforced. |
| Emulator | Running on an emulator rather than physical hardware. |
| Installer | Installed by something other than a trusted store. |
Checks re-run on a randomised schedule while the app is in the foreground. A fixed interval is a gap an attacker can time; the delay is drawn from a cryptographic RNG so there is no reliable quiet period.
Built to be hard to remove
Native detection
Frida detection, library checksums and the anti-ptrace claim live in C, not Kotlin — harder to find and harder to patch than a bytecode branch.
Minimal public surface
The bundled R8 rules keep as little as possible. Every unobfuscated symbol in a security library is a signpost pointing at the method to hook.
Fails closed
An unreadable signature, an unparseable policy, an error mid-check — all treated as a finding, never as a pass.
Pricing
Licensed per application ID. One licence covers your production ID and its environment
suffixes — .qa, .uat, .test — so the whole pipeline
runs on one key.
Development
Free
Evaluation and non-production builds. Every check, no feature limits. 3 months, renewable.
Startup
€100 / year
Production use for apps under 10,000 users. 12 months, email support.
Enterprise
€1,000 / year
Production use for apps at 10,000 users or more. 12 months, priority support.
Prices include VAT and are per application ID. Billing is in euro; the request form shows an indicative conversion to your currency.
The Gradle plugin verifies a licence offline, so your builds work with no network and no call home. A build whose application ID is not covered fails at configuration time.
Requirements
| minSdk | 30 |
|---|---|
| Android Gradle Plugin | 8.0 or newer |
| Gradle | 8.4 or newer, on JDK 17+ |
| ABIs | armeabi-v7a, arm64-v8a, x86_64 |
Native code ships prebuilt in the AAR — you do not need the NDK or CMake to consume it.