Repository navigation
DeviceIntelligence 2.0.0
Stable major release. The SDK no longer performs any network calls — the entire telemetry pipeline (collection → JSON → upload) now lives entirely in the consumer's process and on the consumer's backend.
Removed
- Native analytics layer (
cpp/dicore/analytics.{cpp,h}, 594 LOC). The JNI-bridgedHttpURLConnectionPOST drain that shipped from 1.0.0 onwards —client_idderivation, ring-buffer queue, detached drain thread, fire-and-forget POST to the Cloud Functions ingest endpoint — is gone in its entirety.libdicore.sonow contains zero networking code. NativeBridge.queueTelemetryReport/nativeQueueTelemetryReportand the matchingJava_..._nativeQueueTelemetryReportJNI export.disableAnalyticsGradle DSL property. Redundant; removing it surfaces the new "no analytics, period" contract at build time rather than silently no-op'ing the opt-out.- Manifest opt-out
<meta-data android:name="io.ssemaj.di.analytics" />generation inGenerateOptionalManifestTask. android.permission.INTERNETdeclaration in the library AAR. The permission was only there to satisfy the analytics drain; the library itself never needed it.
Breaking changes (Gradle DSL)
Consumers currently writing
deviceintelligence {
disableAnalytics.set(true)
}will get an Unknown property 'disableAnalytics' for object of type DeviceIntelligenceExtension configuration-time error on 2.0.0.
Migration: delete the line. There is nothing to opt out of any more.
No other public Kotlin / Gradle / JNI surface changed.
Wire-format impact
None. schema_version stays at 2. TelemetryReport, Finding.kind, every detector ID, IntegritySignal, and the JSON encoder are byte-identical to 1.1.0 for the same input. Backends do not need to re-version anything.
Privacy posture
The SDK now makes zero network calls under any configuration. All telemetry stays in the consumer's process until the consumer's own code chooses to upload DeviceIntelligence.collectJson(context) to the consumer's own backend. The README's "Backend-agnostic" / "no SDK tries to talk to a vendor cloud" promise is now true unconditionally (it was previously gated on the optional disableAnalytics.set(true) flag).
Validation
./gradlew :deviceintelligence:assembleRelease :deviceintelligence-gradle:assemble→ BUILD SUCCESSFUL (Kotlin + Gradle plugin + nativelibdicore.soforarm64-v8a,armeabi-v7a,x86_64)../gradlew :deviceintelligence:testDebugUnitTest→ BUILD SUCCESSFUL.- Tree-wide grep for
analytics.h/analytics::/disableAnalytics/queueTelemetryReport/nativeQueueTelemetryReport/io.ssemaj.di.analytics/cloudfunctionsreturns zero hits.
Full diff: 1.1.0...2.0.0