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
相关产品推荐
相关产品推荐

