Compose Multiplatform项目KMP与AGP兼容性弃用警告的解决咨询
嘿,我前阵子刚踩过这个警告的坑,结合你的项目配置,给你梳理下具体的解决步骤,分模块改就清晰多了:
先搞懂警告的核心逻辑
AGP 9.0.0开始,org.jetbrains.kotlin.multiplatform插件就不能和传统的com.android.application/com.android.library插件在同一个模块共存了。官方给了两种针对性方案,刚好对应你项目里的两个模块:composeApp(KMP+androidApplication混合)和shared(KMP+androidLibrary混合)。
一、处理:shared模块的警告(最简单的替换)
这个模块的解决成本最低,直接换官方新出的KMP专用Android库插件就行:
1. 先更新libs.versions.toml
在[plugins]节点下新增KMP Android库插件的别名:
[plugins] # 保留你原来的所有插件,新增这一行 androidKotlinMultiplatformLibrary = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" }
2. 替换:shared模块的插件
打开:shared的build.gradle.kts,把旧的Android库插件换成新的:
plugins { alias(libs.plugins.kotlinMultiplatform) // 把这一行 alias(libs.plugins.androidLibrary) 替换成下面的 alias(libs.plugins.androidKotlinMultiplatformLibrary) }
同步Gradle后,这个模块的警告直接就没了——新插件是官方专门为KMP设计的,会自动和KMP插件配合生成正确的Android库变体,其他编译、依赖配置完全不用动。
二、处理:composeApp模块的警告(需要拆分模块)
这个模块是Android应用+KMP多平台混合,官方要求把Android应用逻辑拆成独立子模块,子模块依赖KMP模块的Android变体。具体步骤:
1. 新建:androidApp子模块(专门放Android应用)
- 在Android Studio里右键项目 → New → Module → 选"Phone & Tablet Module",应用ID、minSdk这些和你原来的
composeApp保持一致 - 删掉自动生成的
MainActivity.kt,把composeApp里的AndroidManifest.xml、res目录(如果有)全移到:androidApp里
2. 配置:androidApp的build.gradle.kts
核心就是依赖我们的KMP模块,把原来composeApp里的Android应用配置移过来:
plugins { alias(libs.plugins.androidApplication) alias(libs.plugins.composeCompiler) } android { namespace = "com.abc.app" compileSdk = libs.versions.android.compileSdk.get().toInt() defaultConfig { applicationId = "com.abc.app" minSdk = libs.versions.android.minSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt() versionCode = 1 versionName = "1.0" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } buildTypes { release { isMinifyEnabled = false } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } buildFeatures { compose = true } } dependencies { // 核心:依赖我们的KMP模块 implementation(project(":composeApp")) implementation(compose.preview) implementation(libs.androidx.activity.compose) debugImplementation(compose.uiTooling) }
3. 改造原来的:composeApp模块
删掉androidApplication插件,让它专注做跨平台UI库,保留KMP和Compose相关配置:
plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.composeMultiplatform) alias(libs.plugins.composeCompiler) alias(libs.plugins.composeHotReload) // 删掉这一行:alias(libs.plugins.androidApplication) } kotlin { androidTarget { compilerOptions { jvmTarget.set(JvmTarget.JVM_11) } } listOf( iosArm64(), iosSimulatorArm64() ).forEach { iosTarget -> iosTarget.binaries.framework { baseName = "ComposeApp" isStatic = true } } jvm() sourceSets { // 把androidMain里的应用级依赖移到:androidApp,这里只保留库级逻辑 androidMain.dependencies { // 移除 implementation(compose.preview)、implementation(libs.androidx.activity.compose) } commonMain.dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material3) implementation(compose.ui) implementation(compose.components.resources) implementation(compose.components.uiToolingPreview) implementation(libs.androidx.lifecycle.viewmodelCompose) implementation(libs.androidx.lifecycle.runtimeCompose) implementation(projects.shared) } commonTest.dependencies { implementation(libs.kotlin.test) } jvmMain.dependencies { implementation(compose.desktop.currentOs) implementation(libs.kotlinx.coroutinesSwing) } } } // 删掉原来的android {}块,现在这个模块是KMP库,不是Android应用了 compose.desktop { application { mainClass = "com.abc.app.MainKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "com.abc.app" packageVersion = "1.0.0" } } }
最后验证
同步Gradle后,两个警告应该都消失了。如果你的项目规模小,暂时不想拆分模块,也可以继续用当前配置直到升级AGP9.0,但还是建议提前适配——不然到时候AGP强制不兼容,改起来更麻烦。
对了,拆分后运行Android应用要选:androidApp的运行配置,Desktop和iOS的运行配置还是用:composeApp的,完全不影响~




