Room 3.0 Ships Under a New Package, Making KMP the Default Path
Room 3.0 is the first version where Kotlin Multiplatform isn't a sidecar — it's the architecture. The package rename and API breakage are deliberate: they force a clean split from the Android-only 2.x line so that shared data layers can target iOS, desktop, and web without carrying Android types into common code.
Room 3.0 is a hard break from the 2.x line. The library moves to the `androidx.room3` package and Maven coordinates, which lets both versions coexist in a project and avoids transitive dependency clashes. KAPT and Java annotation processing are gone; KSP is now mandatory. The core database API replaces `SupportSQLiteDatabase` and Android `Cursor` with a new `SQLiteDriver` abstraction, and direct transaction and query APIs become suspend functions.
A compatibility wrapper artifact exists for code that still needs `SupportSQLiteDatabase`, but the intended path is coroutine-first. `InvalidationTracker.Observer` is removed in favor of `createFlow()`, and return types like `PagingSource`, RxJava, and LiveData now require explicit DAO return type converters. Room 3.0 also adds JavaScript and WasmJS targets, backed by a `WebWorkerSQLiteDriver` that needs a custom Web Worker, and picks up SQLite features like FTS5, `WITHOUT ROWID`, and Kotlin default parameter recognition.
For teams already building a KMP data layer, this is the release to align on. Android-only projects with thin Room wrappers face a manageable migration centered on imports, KSP, and coroutines; projects with deep `SupportSQLite` or `Cursor` usage will have more to untangle.
Renaming the package is the most aggressive move here — it's not cosmetic. It prevents the kind of silent ABI mixing that plagued AndroidX migrations where old and new code compiled together but broke at runtime.
The removal of `SupportSQLite` from the main API is the clearest signal that Google is done treating SQLite as an Android implementation detail. The `SQLiteDriver` abstraction is designed to be platform-agnostic from the start.
Requiring KSP and dropping KAPT isn't just about build speed. KAPT's stub generation model doesn't work well with KMP common source sets, so this is a prerequisite for multiplatform compilation to function correctly.
The Web target is real but raw — no default worker ships with the library. That means early adopters will be writing their own SQLite WASM glue, which is a higher bar than flipping a Gradle flag.
DAO return type converters turn what was previously built-in magic into an explicit extension point. This makes the compiler surface smaller and lets non-Android platforms define their own return wrappers without forking Room internals.
Coexistence of 2.x and 3.0 is the practical migration story. Large projects can isolate the database module, upgrade it independently, and let the rest of the app catch up later — no big-bang rewrite required.
No substantive discussion surfaced.
See top comments, translated →