Android Release版本中Json.decodeFromString失效问题求助
问题分析
Debug版本可正常解析JSON,但Release版本崩溃,错误日志显示Unresolved class: class ru.keytomyself.customeraccounting.ActivityPro$a,核心原因是R8/ProGuard在Release构建时混淆了kotlinx.serialization依赖的序列化类及自动生成的适配器类,导致运行时无法找到对应类。
解决方案
1. 添加kotlinx.serialization的ProGuard规则
在proguard-rules.pro文件中加入以下规则,避免序列化相关类被混淆:
# Kotlinx Serialization基础规则 -keepattributes *Annotation*, InnerClasses -dontnote kotlinx.serialization.AnnotationsKt # 保留所有带@Serializable注解的类及其成员 -keepclasseswithmembers class ** { @kotlinx.serialization.Serializable <fields>; } # 保留自动生成的序列化适配器类 -keepclassmembers class **$$serializer { <methods>; } # 针对当前项目中的内部序列化类,额外保留 -keep class ru.keytomyself.customeraccounting.ActivityPro$PaymentResult { *; } -keep class ru.keytomyself.customeraccounting.ActivityPro$PaymentRequest { *; } -keep class ru.keytomyself.customeraccounting.ActivityPro$PaymentResult$$serializer { *; } -keep class ru.keytomyself.customeraccounting.ActivityPro$PaymentRequest$$serializer { *; }
2. (可选)将序列化类移至顶层
若不想处理内部类的混淆问题,可将PaymentResult和PaymentRequest从ActivityPro内部移到文件顶层,简化混淆规则同时避免内部类带来的潜在问题:
// 移至文件顶层,不再作为ActivityPro的内部类 @Serializable data class PaymentResult(val id: String, val data: String) @Serializable data class PaymentRequest(val result: PaymentResult, val errorCode: Int, val errorMessage: String)
3. 验证Gradle配置正确性
检查模块build.gradle.kts(或build.gradle)是否正确配置了序列化插件与依赖:
plugins { kotlin("plugin.serialization") version "你的Kotlin版本" } dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:对应版本") }
原因说明
kotlinx.serialization会在编译时为每个带@Serializable注解的类生成序列化适配器类(命名格式为类名$$serializer),Release构建的混淆操作会重命名这些类及内部类,导致运行时解析JSON时无法找到对应的适配器,最终抛出Unresolved class异常。添加上述ProGuard规则可保留必要的类与成员,确保序列化功能正常运行。
内容的提问来源于stack exchange,提问作者Андрей Ананьев
相关产品推荐
相关产品推荐

