You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}
解决方案建议
  1. 显式声明sqlite依赖
    不要依赖Room的间接引用,直接在dependencies中添加指定版本的sqlite库,确保编译和运行时版本一致:

    val sqlite_version = "2.3.1"
    implementation("androidx.sqlite:sqlite:$sqlite_version")
    implementation("androidx.sqlite:sqlite-framework:$sqlite_version")
    
  2. 清理Gradle构建缓存
    旧缓存可能残留不兼容的类文件,执行以下命令彻底清理后重新构建:

    ./gradlew clean build --refresh-dependencies
    rm -rf ~/.gradle/caches
    
  3. 检查多模块项目的依赖一致性
    如果是多模块项目,需确保所有子模块的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")
            }
        }
    }
    
  4. 匹配AGP与Room版本
    Room 2.5.x需要对应版本的Android Gradle Plugin(AGP),建议使用AGP 7.4.0或更高版本,避免版本不兼容导致的字节码生成问题。

  5. 检查动态特性模块/即时应用配置
    若应用包含动态特性模块或使用即时应用模式,需在每个模块的build.gradle中单独配置版本强制,确保所有模块的sqlite库版本一致。

内容的提问来源于stack exchange,提问作者M.Ed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:53:16