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

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,提问作者Андрей Ананьев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:20:37