使用Room与KSP时出现‘unexpected jvm signature V’错误的原因及解决
解决Room+KSP编译错误:
unexpected jvm signature V 错误成因
出现这个编译错误核心有两个原因:
- Room依赖版本不统一:项目中Room Runtime(2.8.4)与Room Compiler(2.5.0)版本差异过大,Room要求所有组件版本必须完全一致,版本错位会导致KSP生成代码时出现字节码解析异常。
- KSP与Kotlin版本不兼容:你使用的KSP版本(2.3.4)与项目Kotlin版本(2.2.10)不匹配,KSP版本必须和Kotlin版本严格对应,否则会引发JVM签名解析错误。
至于函数未使用提示,是因为CounterDatabase中的两个方法还未在ViewModel或UI层被调用,属于代码未落地的正常提示。
解决步骤
1. 统一Room所有依赖版本
修改libs.versions.toml,将Room组件版本统一为2.8.4,删除冗余配置:
[versions] # 保留原有其他版本配置,新增统一Room版本 room = "2.8.4" # 删除原roomCompiler、roomRuntime、roomCompilerVersion条目 [libraries] # 保留原有其他依赖配置,修改Room相关依赖 androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } # 删除原room-compiler条目
2. 匹配KSP与Kotlin版本
Kotlin 2.2.10对应的KSP版本为2.2.10-1.0.22,修改项目根目录build.gradle:
plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.compose) apply false // Room id("com.google.devtools.ksp") version "2.2.10-1.0.22" apply false }
3. 清理并重建项目
- 执行
Build > Clean Project - 执行
Build > Rebuild Project - 点击右上角Sync按钮同步Gradle
处理未使用函数提示
在ViewModel中实例化数据库并调用DAO方法,示例代码:
package com.example.counter.counter import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.counter.counter.database.CounterDatabase import kotlinx.coroutines.launch class CounterViewModel(private val context: android.content.Context) : ViewModel() { private val db = CounterDatabase.getDatabase(context) private val dao = db.counterDataAccessObject() fun incrementCounter(id: Int) { viewModelScope.launch { dao.incrementCount(id) } } }
调用后counterDataAccessObject()和getDatabase()的未使用提示会自动消失。
内容的提问来源于stack exchange,提问作者Benedikt Schlütter




