设置 minifyEnabled 为 true 时无法使用 GSON 解析 json 对象

Posted

技术标签:

【中文标题】设置 minifyEnabled 为 true 时无法使用 GSON 解析 json 对象【英文标题】:Cannot parse json objects with GSON when setting minifyEnabled is true 【发布时间】:2020-11-10 21:01:57 【问题描述】:

当我使用时

buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        
    

一切都很完美。

但是如果换成

buildTypes 
        release 
            minifyEnabled true
            useProguard true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        
    

我收到一个解析错误。

我的解析类:

data class SearchItem(
    @SerializedName("position") val position: Long,
    @SerializedName("user") val user: String?
) 
    fun getId(): Long 
        return 0L
    


data class SearchResponse(
    @SerializedName("list") val list: List<SearchItem>,
    @SerializedName("has_more") val has_more: Boolean,
    @SerializedName("rank_token") val rank_token: String,
    @SerializedName("status") val status: String
)

这里我使用 gson:

val searchResponse = Gson().fromJson(jsonObject.toString(), SearchResponse::class.java)

proguard-rules.pro 我有一个非评论行-keepattributes *Annotation*

如果有任何帮助,我将不胜感激!

编辑 错误日志:

E/AndroidRuntime: FATAL EXCEPTION: k.c0 Dispatcher
    Process: PID: 31392
    java.lang.NullPointerException: throw with null exception
        at h.a.a.j.a.a.a(:2)
        at k.l0.g.e$a.run(:6)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)

这只发生在 .apk 安装中。如果我从 Android Studio 运行应用程序,一切都很好。

【问题讨论】:

错误是什么? 请分享崩溃日志 @tyczj java.lang.NullPointerException: throw with null exception 我没有任何错误轨迹,因为这发生在 .apk 安装之后。如果我从 Studio 运行应用程序,一切都很好 【参考方案1】:

我相信您需要编辑您的proguard-rules.pro 文件以在此行中包含这些数据类。你可以阅读更多关于它here

-keepclassmembers,allowobfuscation class * 
@com.google.gson.annotations.SerializedName <fields>;

【讨论】:

以上是关于设置 minifyEnabled 为 true 时无法使用 GSON 解析 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

当我设置 minifyEnabled = true 时,应用程序无法使用 API

将 minifyEnabled 设置为 true 后,我收到以下错误 [重复]

生成带有 minifyEnabled 设置为 true 的签名 APK 后,firebase UI 输出空白

当 minifyEnabled 为 true 时,膨胀类 androidx.fragment.app.FragmentContainerView 时出错

当 minifyenabled 为 true 时,Tesseract 错误 java.lang.NoSuchFieldError

NotSerializableException: kotlin.UNINITIALIZED_VALUE 设置 minifyEnabled 后为 true