You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM共享模块Proguard使用异常:Release版AAR缺失class文件求助

KMM共享模块Release发布后AAR缺失Class文件的混淆解决方案

问题现象

  • 执行shared->publishAndroidReleasePublicationToMavenLocal任务生成的.aar文件中,classes.jar无任何.class文件,本地依赖后无法编译
  • 执行shared->publishAndroidDebugPublicationToMavenLocal生成的AAR正常,包含完整Class文件,可正常依赖使用

问题根因

KMM的Android Release构建开启混淆后,默认Proguard规则会误将Kotlin多平台编译生成的Class文件(尤其是Common模块的产出代码)全部移除,导致最终AAR缺少核心代码。

解决方案

1. 配置Proguard规则文件(proguard-rules.pro)

在共享模块根目录创建或修改该文件,添加以下规则以保留KMM相关代码:

# 保留Kotlin核心类与成员
-keep class kotlin.** { *; }
-keepclassmembers class kotlin.** { *; }

# 保留对外暴露的业务类、接口与方法(替换为你的实际包名)
-keep public class com.example.** {
    public protected *;
}

# 保留Kotlin反射相关类(若项目用到反射)
-keep class kotlin.reflect.** { *; }

# 保留序列化类(若用到Kotlinx Serialization)
-keep class kotlinx.serialization.** { *; }
-keepclassmembers class kotlinx.serialization.** { *; }

# 保留KMM生成的跨平台适配类
-keep class com.example.shared.*$WhenMappings { *; }
-keep class com.example.shared.*$Companion { *; }

# 保留枚举类核心方法
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

2. 调整build.gradle.kts配置

修改Android构建块与发布配置,确保混淆规则生效且AAR包含完整产物:

plugins {
    kotlin("multiplatform")
    id("com.android.library")
    id("maven-publish")
}

group = "com.example"
version = "0.1"

kotlin {
    android {
        publishLibraryVariants("release", "debug")
        compilations.all {
            kotlinOptions.jvmTarget = "1.8"
        }
    }
    iosX64()
    iosArm64()
    iosSimulatorArm64()

    sourceSets {
        val commonMain by getting {
            dependencies {
                with(Deps.Koin) {
                    api(core)
                    api(test)
                }
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test"))
            }
        }
        val androidMain by getting
        val androidTest by getting
        val iosX64Main by getting
        val iosArm64Main by getting
        val iosSimulatorArm64Main by getting
        val iosMain by creating {
            dependsOn(commonMain)
            iosX64Main.dependsOn(this)
            iosArm64Main.dependsOn(this)
            iosSimulatorArm64Main.dependsOn(this)
        }
        val iosX64Test by getting
        val iosArm64Test by getting
        val iosSimulatorArm64Test by getting
        val iosTest by creating {
            dependsOn(commonTest)
            iosX64Test.dependsOn(this)
            iosArm64Test.dependsOn(this)
            iosSimulatorArm64Test.dependsOn(this)
        }
    }
}

android {
    compileSdk = 32
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    defaultConfig {
        minSdk = 21
        targetSdk = 32
    }

    buildTypes {
        getByName("debug") {
            isMinifyEnabled = false
        }
        getByName("release") {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

    // 确保发布的AAR包含源码与文档jar(可选)
    publishing {
        singleVariant("release") {
            withSourcesJar()
            withJavadocJar()
        }
    }
}

// 自定义Maven发布配置(可选,用于精细控制发布内容)
publishing {
    publications {
        register<MavenPublication>("androidRelease") {
            groupId = "com.example"
            artifactId = "demo-shared"
            version = "0.1"
            from(components["androidRelease"])
            pom {
                name.set("Demo KMM Shared Library")
                description.set("Shared KMM library for Android and iOS")
                licenses {
                    license {
                        name.set("MIT License")
                        url.set("https://opensource.org/licenses/MIT")
                    }
                }
            }
        }
    }
}

3. 验证步骤

  • 执行shared->publishAndroidReleasePublicationToMavenLocal任务
  • 找到本地Maven仓库中的AAR文件,解压后检查classes.jar是否包含Class文件
  • 在Android项目中依赖该AAR,验证编译与运行是否正常

内容的提问来源于stack exchange,提问作者Azim Ansari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:24:52