Compatibility
Name Version Implementation Compile SDK 36 compileSdk = q2libs.versions.compileSdk.get() Target SDK 36 targetSdk = q2libs.versions.targetSdk.get() Min SDK 29 minSdk = q2libs.versions.minSdk.get() Java / JVM 21 javaVersion = q2libs.versions.javaVersion Gradle 9.4.1 gradle-wrapper.properties Android Gradle Plugin 9.1.0 id(q2libs.plugins.android.application) Kotlin Gradle Plugin 2.3.20 (built into AGP 9; no explicit plugin alias) KSP 2.3.6 id(q2libs.plugins.ksp) Google Services Plugin 4.4.2 id(q2libs.plugins.google.services) Kotlin Serialization 2.3.20 id(q2libs.plugins.kotlin.serialization)
No toolchain bumps in this release — the table above is unchanged from 26.8.0.
Migration from 26.8.0 to 26.9.0
Doing a multi-version migration?
If you're jumping more than 2–3 versions at once, walking each version's
migration notes individually can be tedious and error-prone. Consider the
Large Version Migrations guide
instead — it walks you through replacing your local DevApp with a fresh
copy at the target tag and dropping your module back in, which atomically
picks up every scaffolding change at once.
SdkModuleConfig.identifier is now nullable
SdkModuleConfig.identifier (and the mirrored SdkModuleInfo.identifier) changed
from String to String?. Modules that do not require an identifier — for
example, pure LifecycleModule or SecurityModule implementations that have no
MethodModule or UIModule entry point — can now omit it from their
sdk_modules entry in settings.json.
MethodModule and UIModule implementations are only reachable from the web
layer via their identifier — omitting it silently disables routing to those
modules. The app throws ClassNotFoundException at the web-side lookup for
any identifier not registered by a module. Always declare an identifier for
MethodModule and UIModule entries.
If your module reads sdkModuleConfig.identifier directly, handle the null case:
- val id : String = sdkModuleConfig . identifier + val id : String ? = sdkModuleConfig . identifier
Java callers now receive @Nullable String and should null-check before use.
SdkUtils.currentUserId — synchronous property (deprecates the callback)
SdkUtils gains a synchronous currentUserId: String? property. It returns
the authenticated user's ID immediately from in-memory state, with no network
call and no callback plumbing.
abstract class SdkUtils ( .. . ) { abstract val currentUserId : String ? @Deprecated ( message = "Use currentUserId property for synchronous cached access." , replaceWith = ReplaceWith ( "currentUserId" ) , level = DeprecationLevel . WARNING ) abstract fun getCurrentUserId ( callback : GetUserIdCallback ) }
Migrate call sites from the callback form to the property. Kotlin:
- sdkUtils . getCurrentUserId ( object : GetUserIdCallback { - override fun value ( userId : String ? ) { - if ( userId != null ) doWork ( userId ) - } - } ) + sdkUtils . currentUserId ? . let { doWork ( it ) }
Java (the property compiles down to a no-arg getCurrentUserId() getter, which
overloads with the existing callback-taking method):
- sdkUtils.getCurrentUserId(userId -> { - if (userId != null) doWork(userId); - }); + String userId = sdkUtils.getCurrentUserId(); + if (userId != null) doWork(userId);
The callback overload is deprecated but still functional in 26.9.0, so this
migration is optional for this release.
The callback form implied an asynchronous fetch, but the value has always been
read from an in-memory holder. Modules that were awaiting the callback (for
example, on login response) could be delayed by unrelated coroutine scheduling.
The property makes the synchronous nature explicit.
Version Updates
Library Version Changes
Library 26.8.0 Version 26.9.0 Version Impact Play Age Signals 0.0.1-beta02 0.0.4 Underlying Play Age Signals SDK bump; no API changes visible to partner modules q2libs.coil.view (new alias)— 2.7.0 Additive — new alias for io.coil-kt:coil alongside coil-compose
Underlying, non-partner-facing dependency bumps are intentionally omitted —
they carry no interface or integration change for partner modules.
Version Catalog
AndroidX Libraries
Library Version Implementation AndroidX Core KTX 1.12.0 implementation(q2libs.androidx.core.ktx) AndroidX AppCompat 1.6.1 implementation(q2libs.androidx.appcompat) AndroidX Activity KTX 1.8.1 implementation(q2libs.androidx.activity.ktx) AndroidX Legacy Support 1.0.0 implementation(q2libs.androidx.legacy.support) AndroidX Constraint Layout 2.1.4 implementation(q2libs.androidx.constraintlayout) AndroidX CardView 1.0.0 implementation(q2libs.androidx.cardview) AndroidX Local Broadcast Manager 1.1.0 implementation(q2libs.androidx.localbroadcastmanager) AndroidX Percent Layout 1.0.0 implementation(q2libs.androidx.percentlayout) AndroidX Biometric 1.1.0 implementation(q2libs.androidx.biometric) AndroidX RecyclerView 1.3.2 implementation(q2libs.androidx.recyclerview) AndroidX WebKit 1.14.0 implementation(q2libs.androidx.webkit) AndroidX Media 1.6.0 implementation(q2libs.androidx.media) AndroidX Browser 1.8.0 implementation(q2libs.androidx.browser) AndroidX Grid Layout 1.0.0 implementation(q2libs.androidx.gridlayout) AndroidX Preference 1.2.1 implementation(q2libs.androidx.preference) AndroidX Security Crypto 1.1.0-beta01 implementation(q2libs.androidx.security.crypto) AndroidX ExifInterface 1.4.2 implementation(q2libs.androidx.exifinterface) AndroidX Credentials (ref only) 1.6.0 (catalog version pin; no library alias yet)
AndroidX Fragment
Library Version Implementation AndroidX Fragment 1.7.0 implementation(q2libs.androidx.fragment) AndroidX Fragment KTX 1.7.0 implementation(q2libs.androidx.fragment.ktx)
AndroidX Navigation
Library Version Implementation AndroidX Navigation Fragment KTX 2.7.4 implementation(q2libs.androidx.navigation.fragment.ktx) AndroidX Navigation UI KTX 2.7.4 implementation(q2libs.androidx.navigation.ui.ktx) AndroidX Navigation Compose 2.8.9 implementation(q2libs.androidx.navigation.compose)
AndroidX Lifecycle
Library Version Implementation AndroidX Lifecycle Runtime KTX 2.7.0 implementation(q2libs.androidx.lifecycle.runtime.ktx) AndroidX Lifecycle ViewModel KTX 2.7.0 implementation(q2libs.androidx.lifecycle.viewmodel.ktx) AndroidX Lifecycle Process 2.7.0 implementation(q2libs.androidx.lifecycle.process) AndroidX Lifecycle Compiler 2.7.0 ksp(q2libs.androidx.lifecycle.compiler) AndroidX Lifecycle Extensions 2.2.0 (Deprecated) implementation(q2libs.androidx.lifecycle.extensions) AndroidX Lifecycle ViewModel Compose 2.7.0 implementation(q2libs.androidx.lifecycle.viewmodel.compose)
AndroidX Room
Library Version Implementation Room Runtime 2.8.4 implementation(q2libs.androidx.room.runtime) Room Compiler 2.8.4 ksp(q2libs.androidx.room.compiler) Room KTX 2.8.4 implementation(q2libs.androidx.room.ktx)
AndroidX CameraX
Library Version Implementation CameraX Camera2 1.5.0 implementation(q2libs.androidx.camera.camera2) CameraX Lifecycle 1.5.0 implementation(q2libs.androidx.camera.lifecycle) Camera View 1.5.0 implementation(q2libs.androidx.camera.view)
AndroidX Compose
Library Version Implementation Compose BOM 2025.12.01 implementation(platform(q2libs.androidx.compose.bom)) Compose Foundation - implementation(q2libs.androidx.compose.foundation) Compose UI - implementation(q2libs.androidx.compose.ui) Compose UI Graphics - implementation(q2libs.androidx.compose.ui.graphics) Compose UI Tooling - implementation(q2libs.androidx.compose.ui.tooling) Compose UI Tooling Preview - implementation(q2libs.androidx.compose.ui.tooling.preview) Compose UI Test Manifest - implementation(q2libs.androidx.compose.ui.test.manifest) Compose UI Test JUnit4 - implementation(q2libs.androidx.compose.ui.test.junit4) Compose Runtime LiveData - implementation(q2libs.androidx.compose.runtime.livedata) Material Icons Core - implementation(q2libs.material.icons.core) Material3 - implementation(q2libs.material3) Material3 Adaptive - implementation(q2libs.androidx.compose.material3.adpative) Activity Compose 1.8.2 implementation(q2libs.activity.compose)
Google Libraries
Library Version Implementation Material 1.10.0 implementation(q2libs.google.material) GSON 2.10.1 implementation(q2libs.google.gson) Play Services Vision 20.1.3 (Deprecated) implementation(q2libs.google.play.services.vision) ZXing Core 3.5.1 implementation(q2libs.google.zxing.core) Age Signals 0.0.4 implementation(q2libs.google.age.signals)
Firebase
Library Version Implementation Firebase Messaging 23.3.0 implementation(q2libs.google.firebase.messaging) Firebase Messaging KTX 23.3.0 implementation(q2libs.google.firebase.messaging.ktx) Firebase Instance ID 21.1.0 implementation(q2libs.google.firebase.iid) Firebase Core 21.1.1 implementation(q2libs.google.firebase.core) Firebase Crashlytics Build Tools 2.9.9 implementation(q2libs.google.firebase.crashlytics.buildtools)
Kotlin & Jetbrains
Library Version Implementation Kotlinx Coroutines 1.7.3 implementation(q2libs.jetbrains.kotlinx.coroutines) Kotlinx Serialization JSON 1.11.0 implementation(q2libs.kotlinx.serialization) Jetbrains Annotations 20.1.0 implementation(q2libs.jetbrains.annotations)
Networking
Library Version Implementation Retrofit2 2.9.0 implementation(q2libs.retrofit2.retrofit) Retrofit2 Converter GSON 2.9.0 implementation(q2libs.retrofit2.converter.gson) Retrofit2 RxJava Adapter 2.1.0 implementation(q2libs.retrofit2.adapter.rxjava) OkHttp3 4.10.0 implementation(q2libs.okhttp3.okhttp) OkHttp3 Logging Interceptor 4.10.0 implementation(q2libs.okhttp3.logging.interceptor) RxAndroid 1.2.0 implementation(q2libs.reactivex.rxandroid) Volley 1.2.1 implementation(q2libs.volley)
Dependency Injection
Library Version Implementation Dagger 2.59.2 implementation(q2libs.dagger) Dagger Compiler 2.59.2 ksp(q2libs.dagger.compiler) Hilt 2.59.2 implementation(q2libs.hilt) Hilt Compiler 2.59.2 ksp(q2libs.hilt.compiler) Hilt Navigation Compose 1.2.0 implementation(q2libs.androidx.hilt.navigation.compose) Glassfish Annotation 10.0-b28 implementation(q2libs.glassfish.annotation)
Dependency Injection (Koin)
Library Version Implementation Koin Android 3.4.3 implementation(q2libs.koin.android) Koin Core 3.4.3 implementation(q2libs.koin.core) Koin AndroidX Compose 3.5.0 implementation(q2libs.koin.androidx.compose)
Third-Party Libraries
Library Version Implementation EventBus 3.3.1 implementation(q2libs.eventbus) EventBus Processor 3.3.1 ksp(q2libs.eventbus.processor) Commons IO 2.6 implementation(q2libs.commons.io) Picasso 2.8 implementation(q2libs.picasso) Coil Compose 2.7.0 implementation(q2libs.coil) Coil View 2.7.0 implementation(q2libs.coil.view) Timber 5.0.1 implementation(q2libs.timber) Apache Commons Imaging 1.0-alpha2 implementation(q2libs.apache.commons.imaging)
Q2 SDK Components
Library Coord Version Implementation Q2 SDK Interfaces com.q2.msdk:sdk_interfacesq2Version implementation project(':sdk_interfaces') Q2 UI Components com.q2:ui-components0.1.1 implementation(q2libs.q2.ui.components) Q2 Routing Service (local project, unpublished) q2Version implementation project(':modules:q2_routing_service')
Plugin Declarations
Plugin ID Implementation Android Application com.android.application id(q2libs.plugins.android.application) Android Library com.android.library id(q2libs.plugins.android.library) KSP com.google.devtools.ksp id(q2libs.plugins.ksp) Compose Compiler org.jetbrains.kotlin.plugin.compose id(q2libs.plugins.compose.compiler) Hilt com.google.dagger.hilt.android id(q2libs.plugins.hilt) Kotlin Parcelize org.jetbrains.kotlin.plugin.parcelize id(q2libs.plugins.kotlin.parcelize) Google Services com.google.gms.google-services id(q2libs.plugins.google.services) Artifactory com.jfrog.artifactory id(q2libs.plugins.artifactory) Kotlin Serialization org.jetbrains.kotlin.plugin.serialization id(q2libs.plugins.kotlin.serialization) Dokka org.jetbrains.dokka id(q2libs.plugins.dokka)
Library Bundles
Bundle Libraries Implementation Dagger dagger, glassfish-annotation implementation(q2libs.bundles.dagger) Retrofit2 retrofit2-retrofit, retrofit2-converter-gson implementation(q2libs.bundles.retrofit2) Koin koin-android, koin-core, koin-androidx-compose implementation(q2libs.bundles.koin)