Android KMM项目kotlinx.serialization Debug正常Release报错求助
解决Kotlin Multiplatform Android Release版本序列化器丢失问题
这个问题我之前在KMM项目里也踩过坑!核心原因是Release版本的代码混淆(Proguard/R8)把Kotlin序列化所需的关键代码和元数据给误删了——Debug版本没开混淆,所以一切正常,而Release开启了minifyEnabled true后,混淆工具就把序列化相关的动态生成代码当成“无用代码”移除了,才会抛出这个找不到序列化器的错误。
第一步:添加ProGuard规则到Android模块的proguard-rules.pro
你需要明确告诉混淆工具,哪些序列化相关的类和元数据不能被移除。把下面的规则添加到Android模块根目录的proguard-rules.pro文件中:
# 保留Kotlin序列化核心元数据 -keepattributes *Annotation*, InnerClasses -dontnote kotlinx.serialization.SerializationKt # 替换为你的PassengerCommon模块实际根包名 # 保留公共模块中所有序列化类的自动生成序列化器 -keep,includedescriptorclasses class com.yourcompany.passengercommon.**$$serializer { *; } # 保留序列化类的Companion对象(序列化器通常在这里) -keepclassmembers class com.yourcompany.passengercommon.** { *** Companion; } # 保留序列化类的serializer方法 -keepclasseswithmembers class com.yourcompany.passengercommon.** { kotlinx.serialization.KSerializer serializer(...); } # 全局保留所有带@Serializable注解的类 -keep @kotlinx.serialization.Serializable class ** { *; } # 保留Ktor客户端序列化相关类(适配你的Ktor版本) -keepclassmembers class io.ktor.client.features.json.serializer.* { *; }
⚠️ 重要提示:一定要把com.yourcompany.passengercommon替换成你公共模块(PassengerCommon)的实际根包名,否则规则不会生效!
第二步:验证现有配置的正确性
- 确认公共模块
build.gradle已经正确应用kotlinx-serialization插件,并且依赖了kotlinx-serialization-runtime(你的配置里已经满足,没问题)。 - 确认Android模块
build.gradle也应用了kotlinx-serialization插件(你的配置里已经添加,无需修改)。 - 如果你使用的是AGP 3.4+版本(默认用R8而非传统ProGuard),上面的规则完全兼容,不需要额外调整。
错误原因补充
Kotlin序列化的序列化器是编译时动态生成的类,混淆工具无法识别这些类在运行时会被调用,所以默认会把它们标记为“未使用代码”并移除。加上上面的规则后,就能强制保留这些关键代码,让序列化逻辑在Release版本中正常工作。
按照这个方案修改后,重新构建Android Release版本,应该就能解决这个问题了!
内容的提问来源于stack exchange,提问作者Hüseyin Bülbül
相关产品推荐
相关产品推荐

