添加kapt启用Room引发编译错误,替换为annotationProcessor后应用崩溃
碰到这种kapt构建报错、换annotationProcessor又崩溃的情况,大概率是版本兼容或者Kotlin项目的注解处理器配置问题,我给你分场景梳理解决方案:
一、搞定kapt的构建报错(kaptKotlin目录相关)
你遇到的这个目录报错,主要是旧版Room和Kotlin/kapt插件不兼容导致的,试试下面几个步骤:
先匹配Kotlin与Room的版本:Room 1.0.0是比较老旧的版本,它和新版Kotlin(1.3+)的kapt插件兼容性很差。如果你的项目用的是Kotlin 1.3及以上版本,建议把Room升级到兼容的稳定版,比如换成AndroidX版本的Room(现在官方都推荐用AndroidX了):
implementation "androidx.room:room-runtime:2.2.6" kapt "androidx.room:room-compiler:2.2.6"要是你必须用旧版的
android.arch.persistence.room,那得把Kotlin版本降到1.2.x左右,确保两者匹配。清理缓存+重构:
- 先点Android Studio的
File -> Invalidate Caches...,勾选Invalidate and Restart重启IDE,这能清掉很多缓存导致的奇怪问题。 - 手动删掉
app/build目录,然后在终端执行gradlew clean build(Windows)或者./gradlew clean build(Mac/Linux),强制重新构建项目。
- 先点Android Studio的
手动指定kapt生成目录(备选):如果上面两步都没用,试试在app的
build.gradle里手动配置kapt的生成目录,避免和其他插件冲突:kapt { generateStubs = true arguments { arg("kapt.kotlin.generated", "${project.buildDir}/generated/source/kaptKotlin") } }
二、解决annotationProcessor导致的启动崩溃
为啥换annotationProcessor会崩溃?因为你的项目是Kotlin的,annotationProcessor是给Java项目用的注解处理器,它生成的代码Kotlin没法正确识别——比如Room的Dao实现类、Database实现类,运行时找不到这些类,自然就崩溃了。
正确的做法是必须用kapt处理Kotlin项目的Room注解,annotationProcessor在Kotlin项目里根本不适用,所以还是回到上面的步骤解决kapt的问题才是正道。
要是你非要用annotationProcessor(非常不推荐),那只能把所有Room相关的类(Entity、Dao、Database)都改成Java编写,这样annotationProcessor才能生成正确的代码,Kotlin代码调用这些Java类才不会出问题,但这会让项目变得混乱,完全没必要。
额外要检查的点
最后再确认几个容易踩坑的地方:
- 你的Database类有没有正确加
@Database注解,并且把所有Entity都列进去?比如:@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } - 初始化Room的时候有没有在Application类里正确创建实例,而不是在Activity里重复创建?
- Dao接口的注解有没有写错?比如
@Query的SQL语句语法对不对,@Insert的参数有没有加对?
内容的提问来源于stack exchange,提问作者Derek

