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

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)的实际根包名,否则规则不会生效!

第二步:验证现有配置的正确性

  1. 确认公共模块build.gradle已经正确应用kotlinx-serialization插件,并且依赖了kotlinx-serialization-runtime(你的配置里已经满足,没问题)。
  2. 确认Android模块build.gradle也应用了kotlinx-serialization插件(你的配置里已经添加,无需修改)。
  3. 如果你使用的是AGP 3.4+版本(默认用R8而非传统ProGuard),上面的规则完全兼容,不需要额外调整。

错误原因补充

Kotlin序列化的序列化器是编译时动态生成的类,混淆工具无法识别这些类在运行时会被调用,所以默认会把它们标记为“未使用代码”并移除。加上上面的规则后,就能强制保留这些关键代码,让序列化逻辑在Release版本中正常工作。

按照这个方案修改后,重新构建Android Release版本,应该就能解决这个问题了!

内容的提问来源于stack exchange,提问作者Hüseyin Bülbül

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:32:51