Choose your platform & integrate.
Install the package from Maven Central, Swift Package Manager, or pub.dev, configure Sentinel credentials, and enforce server-side risk decisions.
Guardian 3.1 is published: Android 3.1.0 on Maven Central, iOS 3.1.1 through Swift Package Manager (CocoaPods remains available as a legacy option), and Flutter 3.1.1 on pub.dev.
Install with Maven Central
PUBLISHED VERSION 3.1.0
// app/build.gradle.kts
dependencies {
implementation("io.github.jimmyleonardo:aegis-guardian:3.1.0")
// Optional: Play Integrity evidence for Sentinel
implementation("io.github.jimmyleonardo:aegis-guardian-integrity:3.1.0")
}What changed in 3.1
Guardian 3.1.0 migration
Android, iOS, and Flutter now share ten named checks and five statuses: clear, detected, unavailable, notConfigured, and unsupported. Required checks pass only when their status is clear. Android reports observable probe failures as unavailable; a false boolean alone does not prove a check passed.
Sentinel telemetry failures return a failure result on every platform. Network, URL, Client ID, and server failures do not trigger the local violation callback or close the host app when the result is ignored. Treat a failed or unavailable result as unverified when authorizing a sensitive action.
Failure categories: premiumRequired, invalidUrl, invalidConfiguration, networkUnavailable, invalidClientId, serverRejected, verificationFailed, and unexpected. An unknown Client ID uses invalidClientId when Sentinel returns a recognized error code.
Handle a telemetry result
val result = guardian.inspectAndMonitor() // Run on a worker thread
result.onSuccess { assessment -> handleVerifiedAssessment(assessment) }
result.onFailure { error ->
when (error.sentinelFailureCode()) {
SentinelFailureCode.NETWORK_UNAVAILABLE -> showOfflineState()
SentinelFailureCode.INVALID_CLIENT_ID -> showConfigurationError()
else -> logTelemetryFailure(error)
}
}Android · SDK Monitoring & Evidence
3.1 API · VERIFIED ENROLLMENT REQUIRED
import com.jimmyleonardo.guardian.AegisGuardian
import com.jimmyleonardo.guardian.SentinelConfig
import com.jimmyleonardo.guardian.integrity.AegisIntegrityProvider
val localGuardian = AegisGuardian.Builder(context).build()
val play = AegisIntegrityProvider(context, cloudProjectNumber)
val evidence = play.sentinelEvidenceProvider(localGuardian, savedEnrollmentId)
val guardian = AegisGuardian.Builder(context)
.setSentinelConfig(SentinelConfig(
baseUrl = "https://sentinel.example.com",
clientId = "YOUR_PUBLIC_CLIENT_ID",
evidenceProvider = evidence
))
.build()
val result = guardian.inspectAndMonitor() // Run on a worker threadBACKEND DECISION ASSESSMENT
Validate Tokens Server-Side
POST /api/v1/assess
Authorization: Bearer <CLIENT_SECRET>
Content-Type: application/json
{ "device_token": "<token from Guardian>" }Full Platform Support Matrix
Understand exactly which runtime checks and security signals are supported across Android, iOS, and Flutter.
| Security capability | Android | iOS | Flutter package |
|---|---|---|---|
| Root / Jailbreak detection | Supported | Supported | Supported |
| Frida hooking detection | Supported | Supported | Supported |
| Debugger attachment detection | Supported | Supported | Supported |
| Virtual device / emulator detection | Supported | Supported | Supported |
| VPN / proxy detection | Supported | Supported | Supported |
| App signature / bundle ID verification | Certificate SHA-256 | Bundle ID match | Platform-backed |
| Hardware attestation evidence | Play Integrity | App Attest | Native bridge |
| Screen privacy protection | FLAG_SECURE | Visual blur overlay | Supported |
| App-scoped Device ID | Widevine/Android ID hash | Keychain UUID | Supported |
| Sentinel telemetry & decisions | Supported | Supported | Supported |