tech.appstack.android-sdk:appstack-android-sdk artifact, newest first. Always integrate against the latest
stable release — appstack-cli review will tell you what you
are on.
Kotlin integration guide
Install, configure, and send your first events.
Added
- Custom event parameters are encrypted on the device before being sent, so personal data such as an
email or phone number leaves the app already protected. Parameter names that need to stay readable
— for example
currency,revenueand campaign fields — are excluded, and that list is controlled server-side, so no code change is required in your app. Revenue is still read out of the parameters before encryption, so revenue reporting is unchanged, as are purchase details and deeplink user data. A value that cannot be encrypted is omitted from the event, and the rest of the event still sends. Works down to the SDK’s minimum API level 21, adds no new dependency, and grows the release AAR by roughly 36 KB.
Added
setCustomerUserId(customerUserId: String?)sets the customer user id afterconfigure(), for when the id is only known once the user logs in. It applies to every event sent from that point on, including events already buffered but not yet delivered. Passingnullor a blank string clears the id, which matters on logout — previously a stale id stayed on the device and tagged the next user’s events. Safe to call from any thread, before or afterconfigure(); the last write wins, so a non-blankcustomerUserIdpassed to a laterconfigure()takes precedence over a call made before it.configure()only ever sets an id, never clears one, so passing itnullleaves whateversetCustomerUserId()established in place. Matches the iOS SDK’ssetCustomerUserId(_:)in both name and null-clears behavior.
- A
setCustomerUserId(...)call made immediately afterconfigure()is no longer overwritten by the value passed toconfigure(). - A repeat
configure()call now logs a warning instead of silently discarding thecustomerUserIdpassed to it. A secondconfigure()has always been a no-op; it now points atsetCustomerUserId().
Added
- Attribution matching now sends additional permissionless device context to improve match accuracy: network availability, carrier and SIM metadata, memory and storage capacity, CPU core count, device uptime and the preferred-language list. Raw IP addresses and persistent telephony identifiers are never collected, no new runtime permission is required, and any signal that is unavailable is simply omitted. The full list is documented under Data Privacy in the README.
- Play installs are now matched deterministically where possible: the install referrer is fetched before the attribution match request and sent along with it, instead of falling back to probabilistic matching.
- A failed Play Store install referrer fetch is retried up to three times per launch. The install event is sent only once ever, so a single transient referrer-service failure on first launch could previously cost that install its deterministic attribution permanently.
sendEvent(EventType.INSTALL)is now ignored, since the SDK already tracks installs automatically. Sending it by hand previously double-counted installs; such calls are now logged at debug level and discarded. Automatic install events are unaffected.
- An app disabled through remote config now makes no attribution network calls at all. Previously only the event uploads were suppressed and the attribution match request still fired on fresh installs.
Added
- Events sent before the SDK finishes initializing are buffered and delivered in order once it is ready, instead of being dropped.
- A missing
INTERNETpermission in the consuming app is now reported explicitly throughInitListener.onError()andgetLastInitError().
- The supported API surface is now explicit:
AppstackAttributionSdk,EventType,LogLevel,InitListener,HttpExceptionandAuthenticationException. Implementation classes moved tocom.appstack.attribution.internal.*and are no longer visible to consumers. Code that referenced those implementation details directly has to move to the supported API. configure()now takescontext,apiKey,logLevel,listenerandcustomerUserId. Deprecated overloads keep older call shapes compiling.
isDebugandendpointBaseUrlonconfigure()are deprecated and now ignored. UselogLevel = LogLevel.DEBUGfor on-device diagnostics (logcat tagAppstackSdk). The deprecated overloads will be removed in the next major version.
- Events could go undelivered from minified release builds on 1.4.0 and 1.4.1: the ProGuard rules shipped with those versions named classes the SDK no longer had, so R8 stripped what the payloads needed and delivery failed silently. The rules now match the classes actually shipped. If you minify your release builds and are on 1.4.x, upgrade.
showDebugOverlay()and the debug overlay it presented are gone. The overlay only repeated whatlogLevellogging already shows. Theis_debugfield is no longer sent with events.- WorkManager is no longer pulled into your app. The SDK dropped its periodic background refresh job
and now declares
androidx.workas a compile-only dependency, so consumers no longer inherit WorkManager, Room and SQLite transitively. Apps upgrading from an older version have the legacy job cancelled once, on a best-effort basis; apps that never shipped WorkManager are unaffected.