微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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*

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。