应用proguard时Gson崩溃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用proguard时Gson崩溃相关的知识,希望对你有一定的参考价值。

我和gson有问题。在对象模型中,我添加了SeriableName

Proguard的:

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-dontwarn sun.misc.**
-keep class com.google.gson.stream.** { *; }
-keepattributes EnclosingMethod

# Application classes that will be serialized/deserialized over Gson
-keep class com.smartmedia.musicplayer.api.AppSetting { *; }

# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

日志崩溃:

  java.lang.AssertionError: java.lang.NoSuchFieldException: DESTROYED
                                                       at com.google.gson.internal.bind.TypeAdapters$EnumTypeAdapter.<init>(SourceFile:791)
                                                       at com.google.gson.internal.bind.TypeAdapters$30.create(SourceFile:817)
                                                       at com.google.gson.Gson.getAdapter(SourceFile:423)
                                                       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(SourceFile:115)
                                                       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(SourceFile:164)
                                                       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(SourceFile:100)
                                                       at com.google.gson.Gson.getAdapter(SourceFile:423)
                                                       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(SourceFile:115)
                                                       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(SourceFile:164)
                                                       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(SourceFile:100)
                                                       at com.google.gson.Gson.getAdapter(SourceFile:423)
                                                       at com.google.gson.Gson.fromJson(SourceFile:887)
                                                       at com.google.gson.Gson.fromJson(SourceFile:853)
                                                       at com.google.gson.Gson.fromJson(SourceFile:802)
                                                       at com.google.gson.Gson.fromJson(SourceFile:774)
答案

哦,快点,我错过了。

你的问题与Gson无关。您尝试使用Gson.fromJson()创建的其中一个类正在从您的代码中进行模糊处理。你能生成未经过模糊处理的日志吗?

基本上,你的问题是你的一个类缺少可能由Proguard重命名的字段DESTROYED

另一种选择是你的Json数据不正确,它包含字段DESTROYED,而它不应该在你的代码中。

另一答案
# Application classes that will be serialized/deserialized over Gson
-keep class com.smartmedia.musicplayer.api.AppSetting { *; }

这还不够。在使用proguard来混淆代码时,您还需要保护类中的成员。在你的情况下,我想建议你的proguard-rules.pro中添加以下proguard规则。

-keepclassmembers class com.smartmedia.musicplayer.api.AppSetting.** { *; }

希望有所帮助。

以上是关于应用proguard时Gson崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用 GSON 库和 ProGuard 时 Android 崩溃

使用 ProGuard 时是不是可以混淆 GSON 注释中的字符串?

使用启用了 proguard 的 GSON

将 proguard 与 Hyperledger Iroha 一起使用时,我的应用程序崩溃了

启用 ProGuard 规则时 Gson 解析不起作用

Gson fromJson 在 Proguard 之后返回 null