Android SDK

Android

The Snapbug Android SDK lets you inspect network requests, databases, analytics events, shared preferences, and more -- all in real time from the Snapbug Desktop app.

Core SDK

Install

Add to gradle/libs.versions.toml:

[versions]
snapbug = "1.0.0"
 
[libraries]
snapbug = { module = "ai.snapbug:snapbug", version.ref = "snapbug" }
snapbug-no-op = { module = "ai.snapbug:snapbug-no-op", version.ref = "snapbug" }

Then in your module's build.gradle.kts:

dependencies {
    debugImplementation(libs.snapbug)
    releaseImplementation(libs.snapbug.no.op)
}

Initialize

Call Snapbug.initialize() in your Application class:

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        Snapbug.initialize(this)
    }
}

Make sure your Application class is declared in AndroidManifest.xml:

<application android:name=".MyApplication" ... />

The No-Op Pattern

Every Snapbug module has a -no-op variant with an identical public API that does nothing. Use debugImplementation for the real module and releaseImplementation for the no-op variant. This ensures:

  • Zero overhead in production builds
  • No Snapbug code shipped to users
  • No need for if (BuildConfig.DEBUG) checks in your code

The pattern is always the same:

debugImplementation("ai.snapbug:<module>:1.0.0")
releaseImplementation("ai.snapbug:<module>-no-op:1.0.0")

Available Plugins

PluginModuleDescription
Network (OkHttp)network-okhttpIntercept OkHttp HTTP traffic
Network (Ktor)network-ktorIntercept Ktor HTTP traffic
DatabasedatabaseBrowse SQLite databases
Database (Room)database-roomRoom database integration
Database (Room 3)database-room3Room 3.x (KMP) database integration
AnalyticsanalyticsMonitor analytics events
Crash Reportercrash-reporterCapture crashes and exceptions
SharedPreferencesshared-preferencesInspect and edit SharedPreferences
DataStoresdatastoresInspect Jetpack DataStore
Deep LinksdeeplinksTest and trigger deep links
FilesfilesBrowse app files and directories
TablestablesDisplay custom tabular data
Debug Feedbackdebug-feedbackIn-app bug reporting overlay

Plugin Setup

Network (OkHttp)

debugImplementation("ai.snapbug:network-okhttp:1.0.0")
releaseImplementation("ai.snapbug:network-okhttp-no-op:1.0.0")
import io.snapbug.sdk.network.okhttp.SnapbugInterceptor
 
val client = OkHttpClient.Builder()
    .addInterceptor(SnapbugInterceptor())
    .build()

Network (Ktor)

debugImplementation("ai.snapbug:network-ktor:1.0.0")
releaseImplementation("ai.snapbug:network-ktor-no-op:1.0.0")
import io.snapbug.sdk.network.ktor.SnapbugKtorPlugin
 
val client = HttpClient(OkHttp) {
    install(SnapbugKtorPlugin)
}

Database (Room)

debugImplementation("ai.snapbug:database-room:1.0.0")
releaseImplementation("ai.snapbug:database-room-no-op:1.0.0")
import io.snapbug.sdk.database.room.SnapbugRoomDatabase
 
SnapbugRoomDatabase.register("my-database", database)

Database (Room 3 / KMP)

debugImplementation("ai.snapbug:database-room3:1.0.0")
releaseImplementation("ai.snapbug:database-room3-no-op:1.0.0")
import io.snapbug.sdk.database.room3.SnapbugRoom3Database
 
SnapbugRoom3Database.register("my-database", database)

Analytics

debugImplementation("ai.snapbug:analytics:1.0.0")
releaseImplementation("ai.snapbug:analytics-no-op:1.0.0")
import io.snapbug.sdk.analytics.SnapbugAnalytics
 
SnapbugAnalytics.log("firebase", "screen_view", mapOf("screen_name" to "Home"))

Crash Reporter

debugImplementation("ai.snapbug:crash-reporter:1.0.0")
releaseImplementation("ai.snapbug:crash-reporter-no-op:1.0.0")
import io.snapbug.sdk.crashreporter.SnapbugCrashReporter
 
// Automatically captures uncaught exceptions once initialized
SnapbugCrashReporter.initialize()

SharedPreferences

debugImplementation("ai.snapbug:shared-preferences:1.0.0")
releaseImplementation("ai.snapbug:shared-preferences-no-op:1.0.0")

No additional setup needed. SharedPreferences are discovered automatically.

DataStores

debugImplementation("ai.snapbug:datastores:1.0.0")
releaseImplementation("ai.snapbug:datastores-no-op:1.0.0")
import io.snapbug.sdk.datastores.SnapbugDataStores
 
SnapbugDataStores.register("settings", settingsDataStore)

Deep Links

debugImplementation("ai.snapbug:deeplinks:1.0.0")
releaseImplementation("ai.snapbug:deeplinks-no-op:1.0.0")

No additional setup needed. Deep links can be triggered from the Desktop app.

Files

debugImplementation("ai.snapbug:files:1.0.0")
releaseImplementation("ai.snapbug:files-no-op:1.0.0")

No additional setup needed. The plugin exposes the app's internal and external file directories.

Tables

debugImplementation("ai.snapbug:tables:1.0.0")
releaseImplementation("ai.snapbug:tables-no-op:1.0.0")
import io.snapbug.sdk.tables.SnapbugTables
 
SnapbugTables.register("Feature Flags") {
    column("Flag", flags.map { it.name })
    column("Enabled", flags.map { it.enabled.toString() })
}

Debug Feedback

debugImplementation("ai.snapbug:debug-feedback:1.0.0")
releaseImplementation("ai.snapbug:debug-feedback-no-op:1.0.0")
import io.snapbug.sdk.debugfeedback.SnapbugDebugFeedback
 
SnapbugDebugFeedback.initialize(this)

This adds a floating overlay button to your app for quick bug reporting.

Version Catalog (Full Example)

Here is a complete libs.versions.toml snippet with all available plugins:

[versions]
snapbug = "1.0.0"
 
[libraries]
snapbug = { module = "ai.snapbug:snapbug", version.ref = "snapbug" }
snapbug-no-op = { module = "ai.snapbug:snapbug-no-op", version.ref = "snapbug" }
snapbug-network-okhttp = { module = "ai.snapbug:network-okhttp", version.ref = "snapbug" }
snapbug-network-okhttp-no-op = { module = "ai.snapbug:network-okhttp-no-op", version.ref = "snapbug" }
snapbug-network-ktor = { module = "ai.snapbug:network-ktor", version.ref = "snapbug" }
snapbug-network-ktor-no-op = { module = "ai.snapbug:network-ktor-no-op", version.ref = "snapbug" }
snapbug-database-room = { module = "ai.snapbug:database-room", version.ref = "snapbug" }
snapbug-database-room-no-op = { module = "ai.snapbug:database-room-no-op", version.ref = "snapbug" }
snapbug-analytics = { module = "ai.snapbug:analytics", version.ref = "snapbug" }
snapbug-analytics-no-op = { module = "ai.snapbug:analytics-no-op", version.ref = "snapbug" }
snapbug-crash-reporter = { module = "ai.snapbug:crash-reporter", version.ref = "snapbug" }
snapbug-crash-reporter-no-op = { module = "ai.snapbug:crash-reporter-no-op", version.ref = "snapbug" }
snapbug-shared-preferences = { module = "ai.snapbug:shared-preferences", version.ref = "snapbug" }
snapbug-shared-preferences-no-op = { module = "ai.snapbug:shared-preferences-no-op", version.ref = "snapbug" }
snapbug-deeplinks = { module = "ai.snapbug:deeplinks", version.ref = "snapbug" }
snapbug-deeplinks-no-op = { module = "ai.snapbug:deeplinks-no-op", version.ref = "snapbug" }
snapbug-files = { module = "ai.snapbug:files", version.ref = "snapbug" }
snapbug-files-no-op = { module = "ai.snapbug:files-no-op", version.ref = "snapbug" }
snapbug-tables = { module = "ai.snapbug:tables", version.ref = "snapbug" }
snapbug-tables-no-op = { module = "ai.snapbug:tables-no-op", version.ref = "snapbug" }
snapbug-debug-feedback = { module = "ai.snapbug:debug-feedback", version.ref = "snapbug" }
snapbug-debug-feedback-no-op = { module = "ai.snapbug:debug-feedback-no-op", version.ref = "snapbug" }

Next Steps