Retrofit api调用可在调试apk中使用,但不能在“已发布APk”版本中使用

问题描述

在我的应用程序改造中效果很好,并且在调试apk中获得了响应,而在已发布apk或已签名apk中却无法正常工作。它在控制台中显示了这样的错误, ** java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'boolean java.lang.String.equalsIgnoreCase(java.lang.String)' 在k.d.a.n.f.b.a(:5) **。

解决方法

如果启用了proguard,则应添加proguard规则并保留模型类

# ALSO REMEMBER KEEPING YOUR MODEL CLASSES
# -keep class com.your.package.model.** { *; }
,

混淆器释放时的问题。阅读this以获得更多详细信息。

在您的情况下,您需要从最小化/混淆中忽略模型类。因为翻新使用模型属性名称来解析对象。您可以尝试使用SerializedName

要忽略混淆模型类,请使用以下命令:

#Models
-dontwarn yourpackage.model.**
-keep class yourpackage.model.** { *; }

您可以看到此proguard文件进行翻新: https://github.com/square/retrofit/blob/master/retrofit/src/main/resources/META-INF/proguard/retrofit2.pro

希望如此。

,

与其他答案不同,我将提出其他建议。我不喜欢保持模型类不混淆的主意,因此最后使用了这种方法。变量将与类名一起混淆,但是您应该不会遇到任何问题。

在创建改造实例时,请使用.addConverterFactory(GsonConverterFactory.create(new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create))而不是.addConverterFactory(GsonConverterFactory.create())

在模型类中,使用如下变量:

@SerializedName("abc")
@Expose
private String abc;

然后,在您的proguard-rules.pro文件中添加以下行:

-keep @interface com.google.gson.annotations.SerializedName
-keep @interface com.google.gson.annotations.Expose
-keepattributes *Annotation*

这些更改之后,即使应用程序被混淆,它也应该可以正常工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...