Android SDK
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
| Plugin | Module | Description |
|---|---|---|
| Network (OkHttp) | network-okhttp | Intercept OkHttp HTTP traffic |
| Network (Ktor) | network-ktor | Intercept Ktor HTTP traffic |
| Database | database | Browse SQLite databases |
| Database (Room) | database-room | Room database integration |
| Database (Room 3) | database-room3 | Room 3.x (KMP) database integration |
| Analytics | analytics | Monitor analytics events |
| Crash Reporter | crash-reporter | Capture crashes and exceptions |
| SharedPreferences | shared-preferences | Inspect and edit SharedPreferences |
| DataStores | datastores | Inspect Jetpack DataStore |
| Deep Links | deeplinks | Test and trigger deep links |
| Files | files | Browse app files and directories |
| Tables | tables | Display custom tabular data |
| Debug Feedback | debug-feedback | In-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
- Connect your device to the Desktop app
- GraphQL inspector for Apollo Client
- Troubleshooting for common issues