Skip to content

DeviceIntelligence 2.0.0

Choose a tag to compare

@iamjosephmj iamjosephmj released this 28 May 16:24
· 116 commits to main since this release

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-bridged HttpURLConnection POST drain that shipped from 1.0.0 onwards — client_id derivation, ring-buffer queue, detached drain thread, fire-and-forget POST to the Cloud Functions ingest endpoint — is gone in its entirety. libdicore.so now contains zero networking code.
  • NativeBridge.queueTelemetryReport / nativeQueueTelemetryReport and the matching Java_..._nativeQueueTelemetryReport JNI export.
  • disableAnalytics Gradle 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 in GenerateOptionalManifestTask.
  • android.permission.INTERNET declaration 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 + native libdicore.so for arm64-v8a, armeabi-v7a, x86_64).
  • ./gradlew :deviceintelligence:testDebugUnitTest → BUILD SUCCESSFUL.
  • Tree-wide grep for analytics.h / analytics:: / disableAnalytics / queueTelemetryReport / nativeQueueTelemetryReport / io.ssemaj.di.analytics / cloudfunctions returns zero hits.

Full diff: 1.1.0...2.0.0