添加KMM共享模块时Gradle同步失败的解决办法
解决KMM共享模块同步错误
问题情况
在现有Android项目中通过Android Studio的KMM插件添加共享模块后,项目同步时出现以下编译错误:
e: /shared/build.gradle.kts:6:8: An annotation argument must be a compile-time constant e: /shared/build.gradle.kts:6:36: Unresolved reference: ExperimentalKotlinGradlePluginApi e: /shared/build.gradle.kts:8:5: Unresolved reference: targetHierarchy FAILURE: Build failed with an exception. * Where: Build file '/shared/build.gradle.kts' line: 6 * What went wrong: Script compilation errors: Line 6: @OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) ^ An annotation argument must be a compile-time constant Line 6: @OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) ^ Unresolved reference: ExperimentalKotlinGradlePluginApi Line 8: targetHierarchy.default() ^ Unresolved reference: targetHierarchy
共享模块的build.gradle.kts内容如下:
plugins { kotlin("multiplatform") id("com.android.library") } @OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) kotlin { targetHierarchy.default() android { compilations.all { kotlinOptions { jvmTarget = "1.8" } } } listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "shared" } } sourceSets { val commonMain by getting { dependencies { //put your multiplatform dependencies here } } val commonTest by getting { dependencies { implementation(kotlin("test")) } } } } android { namespace = "com.example.shared" compileSdk = 33 defaultConfig { minSdk = 23 } }
解决方案
这些错误的核心原因是当前使用的Kotlin Gradle插件版本过低,ExperimentalKotlinGradlePluginApi注解和targetHierarchy特性仅在Kotlin 1.9.0及以上版本中提供。有两种解决方式:
方式一:升级Kotlin Gradle插件版本
- 打开项目根目录的
build.gradle.kts(或build.gradle)文件,找到Kotlin插件的版本配置,将版本升级到1.9.0及以上,例如:
plugins { id("com.android.application") version "8.1.0" apply false id("org.jetbrains.kotlin.android") version "1.9.20" apply false id("org.jetbrains.kotlin.multiplatform") version "1.9.20" apply false }
- 同步项目,原有的
build.gradle.kts代码无需修改即可正常工作。
方式二:不升级插件,手动适配旧版本
如果暂时无法升级Kotlin版本,可以移除依赖新特性的代码,手动配置源集关联:
plugins { kotlin("multiplatform") id("com.android.library") } kotlin { android { compilations.all { kotlinOptions { jvmTarget = "1.8" } } } listOf( iosX64(), iosArm64(), iosSimulatorArm64() ).forEach { it.binaries.framework { baseName = "shared" } } sourceSets { val commonMain by getting val commonTest by getting // 手动关联各平台源集到公共源集 val androidMain by getting { dependsOn(commonMain) } val androidUnitTest by getting { dependsOn(commonTest) } val iosX64Main by getting { dependsOn(commonMain) } val iosX64Test by getting { dependsOn(commonTest) } val iosArm64Main by getting { dependsOn(commonMain) } val iosArm64Test by getting { dependsOn(commonTest) } val iosSimulatorArm64Main by getting { dependsOn(commonMain) } val iosSimulatorArm64Test by getting { dependsOn(commonTest) } } } android { namespace = "com.example.shared" compileSdk = 33 defaultConfig { minSdk = 23 } }
- 同步项目后错误即可消除。
内容的提问来源于stack exchange,提问作者user3578386
相关产品推荐
相关产品推荐

