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

Compose Multiplatform项目KMP与AGP兼容性弃用警告的解决咨询

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模块的插件

打开:sharedbuild.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.xmlres目录(如果有)全移到:androidApp

2. 配置:androidAppbuild.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的,完全不影响~

火山引擎 最新活动