device_guard 0.0.2
device_guard: ^0.0.2 copied to clipboard
A new Flutter plugin to check device security
Device Guard #
A loosely coupled Flutter plugin for Android and iOS device security checks.
Pass only the checks you need. Skip the rest. Sensible defaults when you want them.
Why Device Guard? #
Banking, fintech, and enterprise apps often need to block compromised or non-compliant devices before the user reaches sensitive screens.
Device Guard keeps that logic opt-in:
| You pass | What happens |
|---|---|
requireNotRooted: true |
Root / jailbreak is checked |
| omit the flag | That check is skipped |
useDefaults: true |
Built-in profile is applied for anything you leave null |
result.isValid is true only when every requested check passes.
Checks #
| Check | Flag | Android | iOS | Default |
|---|---|---|---|---|
| Android API level | minSdk |
Yes | — | 34 |
| RAM (GB, marketed / ceil) | minRamGb |
Yes | Yes | 4 |
| Developer Options / Mode | requireDeveloperOptionsOff |
Yes | Yes | true |
| Root / Jailbreak | requireNotRooted |
Yes | Yes | true |
| Emulator / Simulator | requireNotEmulator |
Yes | Yes | true |
| USB Debugging | requireUsbDebuggingOff |
Yes | N/A | false |
| Mock Location | requireMockLocationOff |
Yes | Yes | false |
| VPN | requireNoVpn |
Yes | Yes | false |
| Screen Recording | requireNoScreenRecording |
Yes | Yes | false |
| Screen Sharing | requireNoScreenSharing |
Yes | Yes | false |
| Overlay Apps | requireNoOverlayApps |
Yes | N/A | false |
| Frida | requireNoFrida |
Yes | Yes | false |
| Magisk | requireNoMagisk |
Yes | N/A | false |
| Xposed | requireNoXposed |
Yes | N/A | false |
N/A checks return a safe pass on iOS (the threat does not apply).
Install #
dependencies:
device_guard:
path: ../device_guard # or your published version
import 'package:device_guard/device_guard.dart';
Usage #
1. Defaults #
Applies DeviceGuardDefaults for any flag you do not override:
final deviceGuard = DeviceGuard();
final result = await deviceGuard.verifyDeviceGuard(useDefaults: true);
if (result.isValid) {
// Allow access
} else {
debugPrint(result.errorMessage);
}
Default profile:
- Android API 34+
- 4 GB RAM
- Developer Options off
- Not rooted / jailbroken
- Physical device (not emulator / simulator)
2. Pick only what you need #
final result = await deviceGuard.verifyDeviceGuard(
minSdk: 33,
minRamGb: 6,
requireDeveloperOptionsOff: true,
requireNotRooted: true,
requireNotEmulator: true,
requireNoVpn: true,
requireNoFrida: true,
);
if (!result.isValid) {
debugPrint('Blocked:\n${result.errorMessage}');
}
3. Mix defaults with overrides #
final result = await deviceGuard.verifyDeviceGuard(
useDefaults: true,
minSdk: 33, // override default 34
requireNoVpn: true, // extra check
requireNoFrida: true,
requireNoMagisk: true,
requireNoXposed: true,
);
4. Individual checks #
final clean = await deviceGuard.isNotRooted();
final noVpn = await deviceGuard.isVpnOff();
final noFrida = await deviceGuard.isFridaAbsent();
Result #
Every requested check is a nullable bool on DeviceGuardResult:
null→ not requestedtrue→ passedfalse→ failed
result.isValid; // all requested checks passed
result.errorMessage; // human-readable failures
result.actualSdkInt; // device API (0 on iOS)
result.actualRamGb; // raw RAM in GB
result.displayRamGb; // ceil / marketed GB
result.platformVersion; // e.g. "Android 15"
result.isNotRooted; // true / false / null
Architecture #
Same pattern on both platforms: one checker per concern, wired through a MethodChannel.
lib/device_guard.dart Public API
lib/src/models/ Result + DeviceGuardDefaults
lib/src/platform/ Federated platform interface
android/.../checks/ Kotlin checkers
ios/Classes/Checks/ Swift checkers
Host apps never depend on native types. They only pass true / false / omit.
Android notes #
The plugin declares ACCESS_NETWORK_STATE for VPN detection. It is merged into the host app automatically.
Rebuild the app after adding the plugin (hot reload does not pick up new permissions).
Example #
The example/ app shows every check on a scrollable results screen. Configure which checks run in:
example/lib/src/utils/app_utils.dart
return plugin.verifyDeviceGuard(
useDefaults: true,
minSdk: 33,
requireNoVpn: true,
requireNoFrida: true,
);