v0.12.0-kmb.14 — KSP stage 2: AGP built-in Kotlin, AGP 10 deadline closed
Replaces the classic Kotlin Gradle Plugin with AGP 9.4.0's built-in Kotlin and removes both android.newDsl=false and android.builtInKotlin=false. Those flags are deleted in AGP 10.0 (mid-2026), so this closes that deadline — nothing in the build now depends on anything AGP 10 removes. -Pandroid.debug.obsoleteApi=true reports zero legacy-variant-API warnings, down from three (all three came from kotlin-android itself).
The recorded blocker was wrong in both halves. Stage 2 was documented as blocked because AGP's built-in Kotlin supports neither KSP nor kotlin-parcelize, "and we use both". We never used both — a repo-wide scan found zero @Parcelize and zero Parcelable; the plugin was applied but had never generated anything. Dropping it also moots google/ksp#3053, the hazard most likely to sink this.
The real blocker was version-shaped. Checked against the plugin artifacts rather than the issue tracker: every 2.2.21-* KSP throws an unconditional RuntimeException ("KSP is not compatible with Android Gradle Plugin's built-in Kotlin"), and 2.2.21-2.0.5 was the last release on that line — so google/ksp#2615 was not resolved at the version we were pinned to. KSP 2.3.x versions independently of Kotlin and gates the same refusal on AGP < 9.0.0-alpha14. Bumped to 2.3.11.
Also removed: the two hand-passed Hilt ksp { arg(...) } values (the new DSL wires them again), the kotlin-gradle-plugin classpath entry, and ext.kotlin_version.
The Kotlin compiler is now AGP's bundled one — a future AGP bump is therefore also a Kotlin bump, moving under a KSP pin that no longer moves with it, with nothing failing at configuration time if they drift. Re-check KSP on every AGP bump.
kotlin { jvmToolchain(17) } went with KGP and was replaced, not dropped, by java { toolchain { languageVersion = 17 } } — compileOptions/compilerOptions pin the bytecode level but say nothing about which JDK compiles. Caveat: 17-target bytecode (major version 61) is verified on a JDK 17 host only; the JDK 25 host path is untested.
Verified
Generated Hilt/KSP sources byte-identical to master across all 75 files in both build/generated/ksp/prodDebug/java and build/generated/hilt/component_sources/prodDebug — the compiler swap did not alter DI codegen. kspProdDebugKotlin genuinely runs rather than being skipped. Unit tests, lintVitalProdRelease and assembleProdRelease all pass. Release dex class set identical to master's (671 wallpanel/hilt/dagger descriptors).
Full per-screen DI walk across all 12 Hilt entry points (3 activities, the service, all 8 settings fragments) with no UninitializedPropertyAccessException. smoke-device.sh PASS, panel-render-probe.sh RENDERING, post-install probe RENDERING.
Two apparent regressions found during the walk were proved pre-existing by building master and running the identical check: the Motion/Face/QR rows ignoring taps (they are enabled="false" until Camera Enabled is on), and the release build emitting five identically-sized APKs. Benign packaging delta: kotlin-tooling-metadata.json is gone, a KGP-only artifact.
Known
There have been no native libraries in this APK since kmb.11, so the five ABI splits are degenerate — all ~9.2MB and identical. Splits are deliberately kept for now; disabling them and signing the universal is a standalone follow-up, not something to couple to a compiler change.
Install the attached arm64-v8a APK — signed with our own key.