Room 2.5.2运行时崩溃:NoSuchFieldError错误求助
问题描述
将Android应用的Room数据库从2.4.3升级至2.5.2版本,Gradle依赖配置如下:
dependencies { val room_version = "2.5.2" implementation("androidx.room:room-runtime:$room_version") implementation("androidx.room:room-ktx:$room_version") kapt("androidx.room:room-compiler:$room_version") }
编译成功,但运行时执行查询操作触发崩溃,抛出NoSuchFieldError:
FATAL EXCEPTION: Thread-29 Process: my.app, PID: 29657 java.lang.NoSuchFieldError: No instance field mDelegate of type Landroid/database/sqlite/SQLiteStatement; in class Landroidx/sqlite/db/framework/FrameworkSQLiteStatement; or its superclasses (declaration of 'androidx.sqlite.db.framework.FrameworkSQLiteStatement' appears in /data/app/~~8vd8qCDSVAv==/my.app/base.apk) at androidx.sqlite.db.framework.FrameworkSQLiteStatement.executeInsert(Unknown Source:0) at androidx.room.EntityInsertionAdapter.insertAndReturnId(EntityInsertionAdapter.kt:102)
排查发现:
- 堆栈指向
androidx.sqlite:sqlite-framework:2.3.0版本的类,但代码试图访问2.0.1版本才有的mDelegate字段,推测运行时存在sqlite库版本不匹配 - Room 2.5.0-beta01至2.5.2全版本均出现此问题,且与设备品牌无关
- 执行
./gradlew dependencies未发现第三方库引入旧版Room/sqlite依赖
已尝试的方案
- 更新AndroidX、Kotlin等核心依赖,移除多数第三方依赖,问题依旧
- 将Room Compiler的依赖方式从
kapt切换为ksp/annotationProcessor,无效果 - 通过Gradle的
strictly和resolutionStrategy.force强制指定Room及sqlite版本:
configurations.all { resolutionStrategy { force("androidx.room:room-runtime:2.5.2") force("androidx.room:room-ktx:2.5.2") force("androidx.room:room-compiler:2.5.2") force("androidx.sqlite:sqlite-framework:2.3.1") } } dependencies { implementation("androidx.room:room-runtime") { version { strictly("2.5.2") } } // 其余Room/sqlite依赖同样配置strictly }
解决方案建议
显式声明sqlite依赖
不要依赖Room的间接引用,直接在dependencies中添加指定版本的sqlite库,确保编译和运行时版本一致:val sqlite_version = "2.3.1" implementation("androidx.sqlite:sqlite:$sqlite_version") implementation("androidx.sqlite:sqlite-framework:$sqlite_version")清理Gradle构建缓存
旧缓存可能残留不兼容的类文件,执行以下命令彻底清理后重新构建:./gradlew clean build --refresh-dependencies rm -rf ~/.gradle/caches检查多模块项目的依赖一致性
如果是多模块项目,需确保所有子模块的Room/sqlite版本统一,在项目根目录的build.gradle.kts中用subprojects统一配置版本强制:subprojects { configurations.all { resolutionStrategy { force("androidx.room:room-runtime:2.5.2") force("androidx.room:room-ktx:2.5.2") force("androidx.sqlite:sqlite:2.3.1") force("androidx.sqlite:sqlite-framework:2.3.1") } } }匹配AGP与Room版本
Room 2.5.x需要对应版本的Android Gradle Plugin(AGP),建议使用AGP 7.4.0或更高版本,避免版本不兼容导致的字节码生成问题。检查动态特性模块/即时应用配置
若应用包含动态特性模块或使用即时应用模式,需在每个模块的build.gradle中单独配置版本强制,确保所有模块的sqlite库版本一致。
内容的提问来源于stack exchange,提问作者M.Ed
相关产品推荐
相关产品推荐

