Developer Quickstart

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.

MAVEN CENTRAL ↗

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 thread

BACKEND 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 capabilityAndroidiOSFlutter package
Root / Jailbreak detectionSupportedSupportedSupported
Frida hooking detectionSupportedSupportedSupported
Debugger attachment detectionSupportedSupportedSupported
Virtual device / emulator detectionSupportedSupportedSupported
VPN / proxy detectionSupportedSupportedSupported
App signature / bundle ID verificationCertificate SHA-256Bundle ID matchPlatform-backed
Hardware attestation evidencePlay IntegrityApp AttestNative bridge
Screen privacy protectionFLAG_SECUREVisual blur overlaySupported
App-scoped Device IDWidevine/Android ID hashKeychain UUIDSupported
Sentinel telemetry & decisionsSupportedSupportedSupported