Android SDK changelog
This page lists releases of the Grona Android SDK, newest first. Check it before you change the SDK version in your app.
0.1.0, 29 October 2026
Section titled “0.1.0, 29 October 2026”The first version of the Grona Android SDK. Your app places slots once and ships one release. After that, Grona configuration decides what fills each slot, for whom, and against which control group. The SDK is written in Kotlin for Android Views, and its only dependencies are the Kotlin standard library and coroutines. Errors end in an empty slot, never a crash or a blocked order.
Requires Android 7.0 (API 24) or later. See Install the Android SDK.
New Placements and native components
Add GronaSlotView to the fixed set of named placements, on screens such as home, listing, product, cart, checkout and order confirmation. The SDK renders banner, progress, offer and message components inside the slot, styled through GronaTheme, and an empty slot stays laid out at zero height. See Render components.
New Host-rendered decisions
Product decisions (rail, bundle, substitute and product card) reach your app through Grona.decision(anchor, placement, screen, listener), and your app renders them with its own product cells, prices and stock. Your GronaHost supplies product facts and handles add, replace and typed navigation, always on the main thread. See Host-rendered decisions.
New Signed remote configuration with rollback protection
Each workspace has one ES256-signed configuration with a version, an expiry and a minimum SDK version. A bundled copy applies at launch, and the SDK refreshes the remote copy at cold start and in the foreground, at most every 5 minutes, rejecting bad signatures, older versions and expired configurations while it keeps the last good one. See Signed configuration.
New Kill switch and refresh
A disabled campaign or an expired configuration hides the campaign. Grona.refresh(listener) runs a refresh and reports when it completes.
New Consent states
Grona.setConsent takes UNKNOWN, GRANTED or DENIED, and the default is UNKNOWN, which keeps events in memory only and sends nothing. GRANTED persists and sends events, and DENIED deletes the event queue and any preview pins. See Consent.
New Events and assignment
eligible and anchor_visible fire the same way for every arm, exposure fires when half the content has been visible for one second and is for diagnostics, and commerce events cover views, cart changes, checkout and purchase with minimised payloads. Bucketing is deterministic per install or per customer, with separate draws for holdout and variant. See Track events.
New Server-signed grants for offers
An offer that carries a treatment, such as a discount, renders only with a Grona-signed grant for that customer. Grona.activeTreatments() hands the grant token to your order backend, which verifies it, and without a valid token the order proceeds without the treatment. See Offers and grants.
New Preview links
Grona.handleLink(uri) accepts preview links, each carrying a one-time pairing code that the SDK exchanges for a signed pin bound to that install, so a tester sees one variant on their own device without changing anyone else’s experience. Previewed events are flagged and excluded from analysis. See Preview links.
New Debug view
The separate grona-debug artifact, added with debugImplementation for debug builds only, shows the configuration, slots, campaigns, arms, events and local preview pins. Grona.openDebugView(context) opens it, and the screen blocks screenshots and is not exported. See Test and debug.