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

Android项目运行报错:找不到com.squareup.javapoet.ClassName.canonicalName()方法,官方建议无效求助

Android项目运行报错:找不到com.squareup.javapoet.ClassName.canonicalName()方法,官方建议无效求助

我最近碰到一个头大的问题:Gradle脚本同步完全正常,但一运行应用就抛出这个错误:

Unable to find method ''java.lang.String com.squareup.javapoet.ClassName.canonicalName()''
'java.lang.String com.squareup.javapoet.ClassName.canonicalName()'

Android Studio给的所有方案——重新下载依赖、停止Gradle守护进程、关闭IDE杀Java进程——我都试过了,甚至翻了Stack Overflow的类似问题,还是没解决。项目里用了Hilt做依赖注入,我怀疑问题出在这,但检查了所有注解都没毛病。

下面是我的项目配置信息,麻烦大家帮忙看看:


模块级build.gradle.kts

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.compose)
    alias(libs.plugins.ksp)
    alias(libs.plugins.hilt.plugin)
}

android {
    namespace = "com.bdavidgm.consumoelectrico"
    compileSdk = 36

    defaultConfig {
        applicationId = "com.bdavidgm.consumoelectrico"
        minSdk = 26
        targetSdk = 36
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
   }
    kotlinOptions {
        jvmTarget = "17"
    }
    buildFeatures {
        compose = true
    }
}

configurations.all {
    resolutionStrategy {
        eachDependency {
            if (requested.group == "com.squareup" && requested.name == "javapoet") {
                useVersion("1.13.0")
            }
        }
    }
}

dependencies {
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.lifecycle.runtime.ktx)
    implementation(libs.androidx.activity.compose)
    implementation(platform(libs.androidx.compose.bom))
    implementation(libs.androidx.ui)
    implementation(libs.androidx.ui.graphics)
    implementation(libs.androidx.ui.tooling.preview)
    implementation(libs.androidx.material3)
    implementation(libs.androidx.room.common.jvm)
    implementation(libs.androidx.room.ktx)
    implementation(libs.androidx.runtime)
    implementation(libs.material3)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.espresso.core)
    androidTestImplementation(platform(libs.androidx.compose.bom))
    androidTestImplementation(libs.androidx.ui.test.junit4)
    debugImplementation(libs.androidx.ui.tooling)
    debugImplementation(libs.androidx.ui.test.manifest)

    // DataStore
    implementation("androidx.datastore:datastore-preferences:1.2.0")
    implementation("androidx.datastore:datastore-preferences-core:1.2.0")

    // 加密
    implementation("androidx.security:security-crypto:1.1.0")

    // Hilt
    implementation("com.google.dagger:hilt-android:2.57.1")
    ksp("com.google.dagger:hilt-android-compiler:2.57.1")

    // Material Icons
    implementation("androidx.compose.material:material-icons-core:1.7.8")
    implementation("androidx.compose.material:material-icons-extended:1.7.8")
}

项目级build.gradle.kts

plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.kotlin.android) apply false
    alias(libs.plugins.kotlin.compose) apply false
}

libs.versions.toml

[versions]
agp = "8.12.3"
kotlin = "2.0.21"
coreKtx = "1.10.1"
junit = "4.13.2"
junitVersion = "1.1.5"
espressoCore = "3.5.1"
lifecycleRuntimeKtx = "2.9.4"
activityCompose = "1.11.0"
composeBom = "2024.09.00"
roomCommonJvm = "2.8.4"
roomKtx = "2.8.4"
runtime = "1.9.5"
material3 = "1.4.0"
comGoogleDevtoolsKspGradlePlugin = "1.5.30-1.0.0"
kspver = "2.0.21-1.0.27" # 适配Kotlin 2.0.21的KSP版本
hiltver = "2.57.2"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-ui = { group = "androidx.compose.ui", name = "ui" }
androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-room-common-jvm = { group = "androidx.room", name = "room-common-jvm", version.ref = "roomCommonJvm" }
androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "roomKtx" }
androidx-runtime = { group = "androidx.compose.runtime", name = "runtime", version.ref = "runtime" }
material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
ksp = { id = "com.google.devtools.ksp", version.ref = "kspver" }
hilt-plugin = { id = "com.google.dagger.hilt.android", version.ref = "hiltver" }

我自己摸索出的解决方案(亲测有效)

折腾了大半天,终于找到问题根源:JavaPoet版本不兼容,加上Hilt版本不一致雪上加霜。

1. 移除手动强制的JavaPoet版本

你在模块Gradle里强制指定了JavaPoet用1.13.0,但Hilt 2.57.x的编译器依赖的是JavaPoet 1.14.0+——而ClassName.canonicalName()这个方法在JavaPoet 1.14.0之后才调整为返回String,旧版本要么没有这个方法,要么签名完全不同,导致Hilt生成的代码找不到对应方法。

直接删掉这段代码:

configurations.all {
    resolutionStrategy {
        eachDependency {
            if (requested.group == "com.squareup" && requested.name == "javapoet") {
                useVersion("1.13.0")
            }
        }
    }
}

Gradle会自动根据依赖树拉取最兼容的JavaPoet版本,不用手动干预。

2. 统一Hilt的版本

你在libs.versions.toml里配置的Hilt插件版本是2.57.2,但依赖里用的是2.57.1,版本不一致也会导致奇怪的兼容问题。

修改模块级依赖,统一成2.57.2:

// Hilt
implementation("com.google.dagger:hilt-android:2.57.2")
ksp("com.google.dagger:hilt-android-compiler:2.57.2")

更规范的做法是在libs.versions.toml里添加Hilt的库定义,避免硬编码:
[libraries]节点下加:

hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hiltver" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hiltver" }

然后模块依赖改成:

// Hilt
implementation(libs.hilt.android)
ksp(libs.hilt.compiler)

3. 彻底清理缓存重启

光用Android Studio的Invalidate Caches还不够,手动删干净缓存文件:

  1. 关闭Android Studio
  2. 删除项目根目录下的.gradle.idea文件夹
  3. 删除所有模块里的build文件夹
  4. 重新打开项目,等待Gradle同步完成

4. 最后验证兼容性

确认你的核心依赖版本是匹配的:

  • Kotlin 2.0.21 ↔ KSP 2.0.21-1.0.27(你的配置是对的)
  • AGP 8.12.3 ↔ Kotlin 2.0.21(兼容)
  • Hilt 2.57.2 ↔ AGP 8.0+(兼容)

做完这些步骤后,再运行应用,这个找不到方法的错误应该就消失了。如果还是不行,可以试试把Hilt降级到2.56.0(更稳定的版本,对JavaPoet的依赖更宽松),或者升级到最新版Hilt。

火山引擎 最新活动