Lightweight mobile attribution SDK for Android. Tracks installs, events, and campaign attribution with offline support.
Add to your app's build.gradle.kts:
dependencies {
implementation("app.appsprint:sdk:1.1.4")
}Make sure mavenCentral() is in your repositories:
repositories {
mavenCentral()
}The SDK already declares INTERNET, ACCESS_NETWORK_STATE, and com.google.android.gms.permission.AD_ID, so you do not need to add them to your manifest.
Download the AAR from Releases and add to your project's libs/ directory:
dependencies {
implementation(files("libs/appsprint-sdk.aar"))
implementation("androidx.lifecycle:lifecycle-process:2.8.7")
}importcom.appsprint.sdk.AppSprintimportcom.appsprint.sdk.AppSprintConfigimportcom.appsprint.sdk.AppSprintEventTypeclassMyApplication : Application() {
overridefunonCreate() {
super.onCreate()
val sdk =AppSprint.shared(applicationContext)
sdk.configure(AppSprintConfig(apiKey ="as_live_your_api_key"))
sdk.sendEvent(
AppSprintEventType.PURCHASE,
name ="premium_upgrade",
params =mapOf("revenue" to 9.99, "currency" to "USD")
)
val attribution = sdk.getAttribution()
println("Source: ${attribution?.source}")
}
}val config =AppSprintConfig(
apiKey ="as_live_...", // Required
apiUrl ="https://api.appsprint.app", // Default
enableAppleAdsAttribution =false, // iOS-only, ignored on Android
customerUserId =null, // Optional: your internal user ID
autoTrackSessions =true, // Default: fires session_start on// configure() and foreground,// debounced to 30 min.
autoRefreshAttribution =true, // Default: refreshes attribution// on configure() and foreground.
isDebug =false, // Default
logLevel =2// 0=debug, 1=info, 2=warn, 3=error
)val sdk =AppSprint.shared(context)
// Lifecycle
sdk.configure(config:AppSprintConfig)
sdk.destroy()
sdk.isInitialized():Boolean// Events
sdk.sendEvent(type:AppSprintEventType, name:String?, params:Map?)
sdk.sendTestEvent():TestEventResult
sdk.flush()
// Attribution
sdk.getAttribution():AttributionResult?
sdk.getAttributionParams():Map<String, String>
sdk.getAppSprintId():String?
sdk.refreshAttribution():AttributionResult?
sdk.enableAppleAdsAttribution():Boolean// returns false on Android// User
sdk.setCustomerUserId(userId:String)
// State
sdk.isSdkDisabled():Boolean
sdk.clearData()SESSION_START, LOGIN, SIGN_UP, REGISTER, PURCHASE, SUBSCRIBE, START_TRIAL, ADD_PAYMENT_INFO, ADD_TO_CART, ADD_TO_WISHLIST, INITIATE_CHECKOUT, VIEW_CONTENT, VIEW_ITEM, SEARCH, SHARE, TUTORIAL_COMPLETE, ACHIEVE_LEVEL, LEVEL_START, LEVEL_COMPLETE, CUSTOM
The SDK reads the Google Advertising ID during install registration only, off the main thread. It honors Limit Ad Tracking and drops the all-zero advertising ID, so a bogus value never reaches the backend. Play Install Referrer is collected automatically for Play Store installs.
If you ship this SDK in a published app, include these in your Play Console Data safety answers:
- Advertising ID (collected, used for app functionality and advertising or marketing)
- Device or other IDs (the SDK's internal install identifier and Android's identifier-for-vendors equivalent)
- App activity (event names, parameters, revenue, currency)
- User ID, if you call
setCustomerUserId()
If your app cannot collect advertising IDs (children's apps, certain regional policies), remove the permission in your host app manifest:
<manifestxmlns:tools="http://schemas.android.com/tools" ...>
<uses-permissionandroid:name="com.google.android.gms.permission.AD_ID"tools:node="remove" />
</manifest>Don't pass raw user PII (email, phone, full name) through params or customerUserId. Both persist to SharedPreferences for retry durability. Use hashed or opaque identifiers (SHA-256 of an email, RevenueCat or Superwall app_user_id, your internal user UUID).
- Android API 21+ (Android 5.0)
- Kotlin 1.9+ or Java 17
MIT License. See LICENSE for details.