应用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 注释中的字符串?