应用proguard时Gson崩溃

问题描述 投票:1回答:2

我和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)
android gson
2个回答
1
投票

哦,快点,我错过了。

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

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

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


1
投票
# 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.** { *; }

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.