构建发布版本 Retrofit2 后获得 200 但为空数据

Posted

技术标签:

【中文标题】构建发布版本 Retrofit2 后获得 200 但为空数据【英文标题】:After building release version Retrofit2 gets 200 but empty data 【发布时间】:2020-10-27 09:42:19 【问题描述】:

我收到了这个问题:android Retrofit: Response 200 in both release and debug version but release version have empty value returned

但我认为这不是一个理想的解决方案。但这让我知道这与 Proguard 设置有关。

我已经检查了来自服务器的数据是否不正确。但它是一样的,很好。我的gradle设置相关Proguard是这样的:

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

并且 proguard-rules 文件没有任何异常行。

我将把它改成这个。包括shrinkResources属性:

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

启用proguard后如何正确接收数据?

【问题讨论】:

你在调试模式下得到正确的数据了吗? @ShaluTD 是的。它在调试模式下工作正常。 我可以查看您的完整应用程序 gradle 文件吗?还有你在调试模式下返回的数据? 【参考方案1】:

我通过保留模型的数据名称解决了这个问题。

将此行写入proguard-rules.pro

-keep class com.example.model.* // model is package name.

或者,如果您使用的是 androidX。你可以使用@Keep注解。

@Keep
class YourItem(
    val name: String,
    val age: Int?
    )

【讨论】:

以上是关于构建发布版本 Retrofit2 后获得 200 但为空数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 RxJava2 和 Retrofit2 时如何访问响应头?

Retrofit2 + OkHttp3设置Http请求头(Headers)方法汇总

java.lang.NoClassDefFoundError: retrofit2.Retrofit$Builder Fabric 初始化

Retrofit2 OkHttp3 响应正文空错误

如何使用 Retrofit2 解决空 Web 服务响应?

Retrofit2源码分析