Сбой приложения, когда я запускаю Proguard на GSON (который использует перечисление)

Я использую GSON в своем приложении для Android для анализа данных. Я добавил перечисление в свой объект модели. После добавления перечисления мое приложение начало падать. Когда я сделал runProguard ложным, все работает нормально. Я сделал все, что мог найти в Интернете, чтобы решить проблему, когда программа верна. Но все равно не повезло.

Я уже сделал следующее в файле proguard-rule

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

-keepattributes *Annotation*
-keepattributes Signature

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

Пример перечисления:

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

@SerializedName("upcoming")
UPCOMING,

@SerializedName("replay")
REPLAY; }

Моя трассировка стека

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)

person AAV    schedule 18.04.2014    source источник


Ответы (3)


Это должно быть решено с помощью следующего правила:

-keepclassmembers enum * { *; }

или используйте следующее:

-keepclassmembers enum com.your.package.** { *; }

Связанный ответ: https://stackoverflow.com/a/30167048/4758255

person ישו אוהב אותך    schedule 17.04.2017
comment
Это правильный ответ для меня. Добавление следующей строки в proguard решает мою проблему: -keepclassmembers enum * { *; } - person Saeed Sharman; 05.01.2018
comment
помог мне. Спасибо, бро - person Abbas Torabi; 03.05.2021

Я решил эту проблему, добавив эти правила в свой файл правил proguard:

    # GSON.
-keepnames class com.google.gson.** {*;}
-keepnames enum com.google.gson.** {*;}
-keepnames interface com.google.gson.** {*;}
-keep class com.google.gson.** { *; }
-keepnames class org.** {*;}
-keepnames enum org.** {*;}
-keepnames interface org.** {*;}
-keep class org.** { *; }

-keepnames class com.yourpackagename.net.** {*;}
-keepnames enum com.yourpackagename.net.** {*;}
-keepnames interface com.yourpackagename.net.** {*;}
-keep class com.yourpackagename.net.** { *; }

-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
person Fadwa Bechri    schedule 23.10.2018

Пожалуйста, проверьте следующие вещи-

  1. Добавлен файл proguard-rules.pro, добавленный в каталог приложения.

  2. путь, определенный в файле build.gradle(module:app) определение пути правильное, как показано ниже:

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

  1. Если предыдущие 2 шага в порядке, добавьте следующую строку (правило) в файл progaurd:

    -keepclassmembers перечисление * { *; }

  2. Очистите, соберите проект и запустите снова.

person subhash gaikwad    schedule 03.03.2020