2. 环境搭建:添加依赖、KSP/KAPT配置、Android Studio设置

说实话,很多同学学到Room时,第一反应是「不就是加个依赖吗?」结果一跑就崩——编译报错、版本冲突、找不到符号……我当年踩过的坑,现在说出来都是眼泪。环境搭不对,后面写得再漂亮也白搭。咱们先把这个地基打牢。

2.1 选择武器:KSP还是KAPT?

Room使用注解处理器生成代码。在Kotlin世界里,你有两个选择:KAPT(Kotlin Annotation Processing Tool)和KSP(Kotlin Symbol Processing)。

我个人的建议是:能用KSP就别碰KAPT。 KSP是Google官方推荐的替代方案,编译速度比KAPT快2倍以上。我在一个中型项目里试过,KSP完整编译时间从4分20秒降到了2分15秒。你想想看,一天编译十几次能省多少时间?

一句话选择原则:
• 新项目 → 直接用KSP
• 老项目迁移 → 如果KAPT版本没问题,可以先不换,但建议尽快迁移
• Room版本 ≥ 2.4.0 就支持KSP,更低版本只能用KAPT

为什么会这样?因为KSP跳过了Kotlin到Java的中间转换步骤,直接操作AST(抽象语法树)。说白了,少了一层加工,自然快得多。

2.2 添加依赖:build.gradle配置

不管用哪种处理器,Room本身的依赖是一样的。区别只在注解处理器的声明方式上。

第一步:项目级 build.gradle(根目录)
如果你用KSP,先声明KSP插件版本:

// 项目根目录 build.gradle.kts
plugins {
    id("com.google.devtools.ksp") version "2.0.21-1.0.27" apply false
}

第二步:模块级 build.gradle
以KSP为例,完整配置如下:

// app/build.gradle.kts
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("com.google.devtools.ksp") // 记得启用
}

android {
    // ... 其他配置 ...
}

dependencies {
    // Room 核心
    implementation("androidx.room:room-runtime:2.6.1")
    // KSP 注解处理器(如果Room版本支持)
    ksp("androidx.room:room-compiler:2.6.1")
    // 可选:Room协程扩展
    implementation("androidx.room:room-ktx:2.6.1")
    // 可选:Room RxJava3扩展
    // implementation("androidx.room:room-rxjava3:2.6.1")
    // 可选:测试支持
    testImplementation("androidx.room:room-testing:2.6.1")
}

如果你坚持用KAPT,把 ksp(...) 换成 kapt(...),并且在插件中加上 id("org.jetbrains.kotlin.kapt")。

2.3 KSP与KAPT配置对比

对比项 KSP KAPT
处理方式 直接处理Kotlin符号 先转成Java存根再处理
编译速度 快(通常快2~3倍) 慢(尤其大项目)
R8兼容性 更好 一般
Room最低版本 2.4.0 任何版本
配置复杂度 低 低(但需要kapt插件)
小技巧: 查看Room官方Release页面,确认你使用的Room版本是否需要特定KSP版本。比如Room 2.6.1搭配KSP 2.0.21-1.0.27是经过验证的。

2.4 Android Studio设置与Kotlin版本匹配

我记得有一次帮同事排查问题,他明明加对了依赖,编译就是报错「Unresolved reference: ksp」。结果一看——Android Studio里的Kotlin插件版本是1.6.0,而KSP要求的Kotlin版本是1.9.0+。版本不匹配,神仙也救不了。

关键检查点:

  • Project Structure → SDK Location → Gradle JDK:建议用JDK 17或21(Room 2.6+强制要求JDK 17+)
  • File → Settings → Languages & Frameworks → Kotlin:确认Kotlin插件版本与你使用的Kotlin版本一致
  • Android Studio版本:建议使用最新稳定版(至少Hedgehog 2023.1.1)

Gradle JVM参数(可选但推荐):

// gradle.properties(项目根目录)
org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=512m
kapt.use.worker.api=false
# 如果用KSP,可以加这个提升速度
ksp.useKsp2=false
我曾经踩过一个坑: 在Windows系统下,KAPT在处理大量注解时,容易触发「Out of Memory: Metaspace」。如果你用KAPT且Room中有大量Entity(比如超过50个),记得在gradle.properties里调大Metaspace。

2.5 环境搭建核心流程

下面这张图把整个流程串起来了。你按照从左到右的顺序操作,基本不会漏东西。

Room 环境搭建核心流程 选择 KSP 还是 KAPT? 选 KSP 选 KAPT 添加 Room 依赖 + 注解处理器(room-runtime + room-compiler) 配置 Gradle(项目级+模块级+gradle.properties) Android Studio 设置(Kotlin版本 / JDK / 插件) Clean & Rebuild 验证

2.6 避坑指南:我经历过的几个血泪教训

  • 版本号不一致: Room的版本必须和room-compiler完全一致!别一个写2.6.1,另一个写2.5.0。我见过有人复制粘贴时忘了改后面的版本号,结果编译通过但运行崩溃。排查了好几个小时才找到原因。
  • KSP版本与Kotlin版本不匹配: KSP的release版是严格按照Kotlin版本命名的。比如Kotlin 2.0.21对应KSP 2.0.21-1.0.27。如果你升级了Kotlin版本,KSP必须同步升级。不然编译时会报「Could not resolve com.google.devtools.ksp」。
  • KAPT慢到怀疑人生: 如果你在大型项目中坚持用KAPT,第一次全量编译可能要等5分钟以上。我建议关掉增量编译(在gradle.properties里加kapt.incremental.apt=true,但这只是缓解)。有条件直接上KSP。
  • JDK版本太低: Room 2.6.0+要求JDK 17。如果你还在用JDK 11,赶紧升级。Android Studio自带的JDK就很好,不需要单独装。

2.7 验收:如何确认环境搭好了?

打开Android Studio,执行一次 Build → Clean Project,然后 Build → Rebuild Project。如果控制台没有红色错误,最后出现 BUILD SUCCESSFUL,恭喜你,环境搭好了。

快速验证代码(放在任何Activity的onCreate里测试):
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM User")
    suspend fun getAll(): List<User>
}

如果能正常编译,说明Room的注解处理生效了。如果你看到类似「Not sure how to convert a Cursor to this method's return type」之类的错误,先别慌,那是Room在提示你Dao方法签名有问题——回头再看第一章的内容。

最后一个小建议: 把Room的Gradle配置写一个代码片段保存起来。下次开新项目直接复制,省得每次都要查版本号。我个人习惯存到公司的Wiki里,团队统一版本,避免出现「我这里能编译你那里不行」的尴尬。