Android v26.6.0
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) |
Migration from 26.5.0 to 26.6.0
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.
This release is a major toolchain upgrade. JVM target moves from 17 to 21, Gradle goes from
8.14.4 to 9.4.1, the Android Gradle Plugin jumps from 8.13.0 to 9.1.0, and Kotlin advances from
2.0.20 to 2.3.20. The annotation-processing pipeline migrates from KAPT to KSP, and the standalone
kotlin-android plugin alias is no longer applied (Kotlin is integrated into AGP 9). Every DevApp
and every Q2 module must be rebuilt against this release.
The Q2 SDK Interfaces additions in this release (OAuthUtils.accessToken and the new accessToken
parameter on LoginResponse.OAuthTokenResponse) are additive and backward compatible at the
source level — but combined with the toolchain bump, all modules must be republished against
sdk_interfaces 0.3.13.
Modules built prior to 26.6.0 are not compatible with a 26.6.0 Q2 Mobile App. Every module must update its build configuration as described below and republish against the 26.6.0 toolchain.
Required DevApp build configuration updates
The DevApp template was updated alongside this release. Apply the same changes to your DevApp and to every module project.
1. Bump the JVM target to 21
Your environment must run on JDK 21. Update compileOptions in default_config.gradle (or
wherever your shared Android config lives) to source the version from the catalog:
android {
compileOptions {
def jv = JavaVersion.toVersion(q2libs.versions.javaVersion.get())
sourceCompatibility jv
targetCompatibility jv
}
}
Remove any explicit kotlinOptions { jvmTarget = "17" } block — jvmTarget is now derived
automatically from compileOptions by Kotlin 2.3 / AGP 9.
In the root build.gradle, the allprojects { ext { ... } } block should reference 21:
allprojects {
ext {
javaVersion = JavaVersion.VERSION_21
jvmTarget = "21"
}
}
2. Migrate from KAPT to KSP
Hilt's compiler now runs through KSP. In every module that uses Hilt:
- Remove the
alias q2libs.plugins.kotlin.kaptplugin entry. - Add
alias q2libs.plugins.ksp. - Replace every
kapt q2libs.hilt.compilerdependency withksp q2libs.hilt.compiler.
plugins {
alias q2libs.plugins.android.application
alias q2libs.plugins.google.services
alias q2libs.plugins.ksp // was: alias q2libs.plugins.kotlin.kapt
alias q2libs.plugins.hilt
}
dependencies {
implementation q2libs.hilt
ksp q2libs.hilt.compiler // was: kapt q2libs.hilt.compiler
}
The kotlin-kapt plugin alias has been removed from the version catalog entirely. Any remaining
kapt(...) dependency entries elsewhere in your module must also migrate to ksp(...).
3. Drop the kotlin-android plugin alias
AGP 9 integrates Kotlin compilation directly. The standalone org.jetbrains.kotlin.android plugin
should no longer be applied. Remove every line that looks like:
alias q2libs.plugins.kotlin.android // remove this
apply plugin: 'kotlin-android' // remove this from default_config.gradle
The catalog entry for kotlin-android has been removed in 26.6.0.
4. Remove android.enableJetifier=true
Jetifier is no longer needed. Delete this line from gradle.properties:
android.enableJetifier=true # remove
5. Bump the Gradle wrapper
Update gradle/wrapper/gradle-wrapper.properties:
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
6. Update q2Version
q2Version=26.6.0
7. Drop the stale kotlin_version ext
If your root build.gradle still pins a kotlin_version in project.ext, remove it. Kotlin
versions are managed exclusively through the version catalog now.
project.ext {
kotlin_version = '1.7.20' // remove this line
sdkVersionCode = 1
}
Version Updates
This release updates the Q2 SDK Interfaces library from 0.3.11 to 0.3.13 and bumps the entire core build toolchain. Highlights:
Library Version Changes
| Library | 26.5.0 Version | 26.6.0 Version | Impact |
|---|---|---|---|
| Q2 SDK Interfaces | 0.3.11 | 0.3.13 | Updated — See SDK Interfaces section |
| Java / JVM Target | 17 | 21 | Breaking — JDK 21 required to build |
| Gradle | 8.14.4 | 9.4.1 | Breaking — Wrapper update required |
| Android Gradle Plugin | 8.13.0 | 9.1.0 | Breaking — Kotlin now integrated into AGP |
| Kotlin Gradle Plugin | 2.0.20 | 2.3.20 | Breaking — Bundled with AGP 9; no standalone alias |
| Hilt | 2.57 | 2.59.2 | Breaking — Module rebuild required, KSP-only compiler |
| KSP | (not present) | 2.3.6 | New — Replaces KAPT for annotation processing |
| Google Services Plugin | 4.3.15 | 4.4.2 | Updated |
| Compose BOM | 2024.09.02 | 2025.12.01 | Updated — Pulls in newer Compose libraries |
| Kotlin Serialization Plugin | 2.0.20 | 2.3.20 | Updated — Tracks Kotlin |
| kotlinx-serialization-json | 1.7.3 | 1.11.0 | Updated |
| Room | 2.6.0 | 2.8.4 | Updated |
| AndroidX CameraX View | 1.0.0-alpha22 | 1.5.0 | Updated — Now follows the shared camerax ref |
| Compose Material Icons Core | (not present) | (BOM-managed) | New — material-icons-core library available via the catalog |
| Jetifier | enabled | disabled | Breaking — android.enableJetifier=true removed |
| KAPT plugin alias | present | removed | Breaking — Migrate annotation processors to KSP |
| Kotlin Android plugin alias | present | removed | Breaking — AGP 9 applies Kotlin automatically |
Q2 SDK Interfaces Changes
The q2-sdk-interfaces artifact moves from 0.3.11 to 0.3.13 in this release.
OAuthUtils — Access token now exposed
OAuthUtils now exposes the OAuth accessToken alongside the existing idToken. Modules that
need to call OAuth-protected APIs as the authenticated user should use this new property.
interface OAuthUtils {
/**
* the id token provided by the authorization server.
*/
val idToken: String
/**
* the access token provided by the authorization server.
*/
val accessToken: String
}
Usage:
val oauthAccessToken: String = sdkUtils.oAuthUtils.accessToken
LoginResponse.OAuthTokenResponse — Access token parameter
LoginResponse.OAuthTokenResponse gained a new accessToken: String? constructor parameter. The
parameter is nullable, so existing callers compile unchanged when invoked via named arguments —
but positional callers must add the new argument.
Before:
class OAuthTokenResponse(
val q2Token: String,
val idToken: String?,
val username: String? = null
) : LoginResponse()
After:
class OAuthTokenResponse(
val q2Token: String,
val idToken: String?,
val accessToken: String?,
val username: String? = null
) : LoginResponse()
accessToken is positional and therefore not source-compatible for positional callers. If your
module instantiates OAuthTokenResponse directly with positional arguments, add accessToken
between idToken and username.
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.8.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 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.androix.compose.ui.graphics) |
| Compose UI Tooling | - | implementation(q2libs.androix.compose.ui.tooling) |
| Compose UI Tooling Preview | - | implementation(q2libs.androix.compose.ui.tooling.preview) |
| Compose UI Test Manifest | - | implementation(q2libs.androix.compose.ui.test.manifest) |
| Compose UI Test JUnit4 | - | implementation(q2libs.androix.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.1-beta02 | 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 | 2.7.0 | implementation(q2libs.coil) |
| Timber | 5.0.1 | implementation(q2libs.timber) |
| Apache Commons Imaging | 1.0-alpha2 | implementation(q2libs.apache.commons.imaging) |
Q2 SDK Components
| Library | Version | Implementation |
|---|---|---|
| Q2 SDK Interfaces | 0.3.13 | implementation(q2libs.q2.sdk.interfaces) |
| Q2 UI Components | 0.1.1 | implementation(q2libs.q2.ui.components) |
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) |