luoxianli / google-gson

Automatically exported from code.google.com/p/google-gson
0 stars 0 forks source link

App crashing when I run Proguard on GSON (which using enum) #572

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
I am using GSON in my Android app to parser the data. I have added an enum in 
my Model object. After adding an enum my app started crashing. When I made 
runProguard false everything works fine. I did everything I could find on 
internet to fix the problem when program is true. But still no luck.

I have already done following thing in Prodgrad-rule file

-keep class com.google.** { *; }

-keepattributes Annotation -keepattributes Signature

-keepclassmembers enum * { public static **[] values(); public static ** 
valueOf(java.lang.String); }

Enum Stuff exmaple

public enum TypeX {
@SerializedName("live")
LIVE,

@SerializedName("upcoming")
UPCOMING,

@SerializedName("replay")
REPLAY; }
My stack trace

java.lang.AssertionError
        at com.google.gson.internal.bind.TypeAdapters$EnumTypeAdapter.<init>(Unknown Source)
        at com.google.gson.internal.bind.TypeAdapters$26.create(Unknown Source)
        at com.google.gson.Gson.getAdapter(Unknown Source)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(Unknown Source)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(Unknown Source)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(Unknown Source)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(Unknown Source)
        at com.google.gson.Gson.getAdapter(Unknown Source)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(Unknown Source)
        at com.google.gson.Gson.getAdapter(Unknown Source)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.<init>(Unknown Source)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(Unknown Source)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(Unknown Source)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(Unknown Source)
        at com.google.gson.Gson.getAdapter(Unknown Source)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(Unknown Source)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(Unknown Source)
        at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(Unknown Source)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(Unknown Source)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(Unknown Source)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(Unknown Source)
        at com.google.gson.Gson.toJson(Unknown Source)
        at com.google.gson.Gson.toJson(Unknown Source)
        at com.google.gson.Gson.toJson(Unknown Source)
        at com.google.gson.Gson.toJson(Unknown Source)
        at com.theice.gsonapp.app.MainActivity.a(Unknown Source)
        at com.theice.gsonapp.app.MainActivity.onCreate(Unknown Source)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

Original issue reported on code.google.com by amit.a.v...@gmail.com on 18 Apr 2014 at 2:27

GoogleCodeExporter commented 9 years ago
See issue 561 for an explanation of what's happening and the fix. Basically, 
you need to register a type adapter since the enum field names won't match the 
values in JSON after ProGuard and the mangling breaks normal enum conventions.

Furthermore, this violates JLS 8.9.2: 
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2

> In addition to the members that an enum type E inherits from Enum<E>, for 
each declared enum constant with the name n, the enum type has an implicitly 
declared public static final field named n of type E.

Original comment by j...@squareup.com on 9 Aug 2014 at 6:25