You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动