[versions] # Pinned as a MATRIX, matching Minstrel's proven combination on the same JDK: # - Gradle 9.1.0 supports JDK 25 (see gradle-wrapper.properties) # - AGP 9.0.1 requires Gradle 9.1.0+ # - Kotlin 2.3.x is AGP 9's built-in Kotlin path # ci-rust-android ships JDK 25, so the wrapper floor is load-bearing: an older # Gradle fails on that JDK with an opaque "25.0.3" message. agp = "9.0.1" kotlin = "2.3.21" compose-bom = "2026.05.01" lifecycle = "2.8.7" activity-compose = "1.9.3" coroutines = "1.9.0" # WorkManager runs the background sync. `work-runtime-ktx` is NOT used: as of # 2.11 it is a 6 KB stub and every Kotlin extension (`PeriodicWorkRequestBuilder`, # `CoroutineWorker`) has moved into `work-runtime` itself. Verified by unpacking # both artifacts, not from memory. work = "2.11.2" # ktlint and detekt are NOT Gradle plugins here. ci-rust-android already ships # both as pinned CLIs (M12 step 3), and the CI lane invokes those directly. Adding # the Gradle plugins would mean a SECOND pinned version of each tool, resolved at # build time, that has to be kept in lockstep with the image's by hand — and the # first attempt at it failed outright, because the detekt version Minstrel pins # (2.0.0-alpha.3) is not published to Maven Central or the plugin portal at all. # JNA is not optional: uniffi's Kotlin bindings call into the .so through it. # The @aar classifier matters — the plain jar has no Android native payload and # fails at runtime with UnsatisfiedLinkError rather than at build time. jna = "5.14.0" junit = "4.13.2" [libraries] androidx-core-ktx = { module = "androidx.core:core-ktx", version = "1.13.1" } androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity-compose" } androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycle" } compose-bom = { module = "androidx.compose:compose-bom", version.ref = "compose-bom" } compose-ui = { module = "androidx.compose.ui:ui" } compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics" } compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } compose-material3 = { module = "androidx.compose.material3:material3" } # Icons only from -core, deliberately: it carries the common set (Menu, Search, # Close, Add) and is already on the material3 path. -extended adds ~1,000 vectors # for the handful the drawer would use. compose-material-icons-core = { module = "androidx.compose.material:material-icons-core" } kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" } jna = { module = "net.java.dev.jna:jna", version.ref = "jna" } androidx-work-runtime = { module = "androidx.work:work-runtime", version.ref = "work" } junit = { module = "junit:junit", version.ref = "junit" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }