【问题标题】:Gson: Missing type parameter - proguard trouble in android appGson:缺少类型参数 - android应用程序中的proguard问题
【发布时间】:2017-03-25 16:07:35
【问题描述】:

我将 Gson 库用于序列化/反序列化对象,当我在禁用 proguard 的调试模式下构建时,应用程序工作正常。然后我将构建变体更改为发布,并将 minifyEnabled 设置为 true。 之后我得到了异常

 E/AndroidRuntime: FATAL EXCEPTION: main
                                               Process: test.android, PID: 30168
                                               java.lang.ExceptionInInitializerError
                                                   at test.android.storage.Prefs.restoreInternalStudent(Unknown Source)
                                                   at test.android.activities.a.e(Unknown Source)
                                                   at test.android.activities.MainActivity.r(Unknown Source)
                                                   at test.android.activities.MainActivity.w(Unknown Source)
                                                   at test.android.activities.e.run(Unknown Source)
                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                   at android.os.Looper.loop(Looper.java:145)
                                                   at android.app.ActivityThread.main(ActivityThread.java:5942)
                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
                                                Caused by: java.lang.RuntimeException: Missing type parameter.
                                                   at com.google.gson.reflect.TypeToken.getSuperclassTypeParameter(Unknown Source)
                                                   at com.google.gson.reflect.TypeToken.<init>(Unknown Source)
                                                   at com.google.gson.q.<init>(Unknown Source)
                                                   at com.google.gson.Gson.<clinit>(Unknown Source)
                                                   at test.android.storage.Prefs.restoreInternalStudent(Unknown Source) ...

保护规则

        ##---------------Begin: proguard configuration for Gson  ----------
    # Gson uses generic type information stored in a class file when working with fields. Proguard
    # removes such information by default, so configure it to keep all of it.
    -keepattributes Signature

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

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

    # Also you must note that if you are using GSON for conversion from JSON to POJO representation, you must ignore those POJO classes from being obfuscated.
    # Here include the POJO's that have you have created for mapping JSON response to POJO for example.
    -keep class test.android.api.models.** { *; }
    -keep class test.android.api.request.** { *; }
    -keep class test.android.models.** { *; }
    -keepclasseswithmembers class test.android.storage.Prefs {*;}
    -keepclasseswithmembers class com.google.gson.** {*;}


    -keep class com.google.gson.examples.android.model.** { *; }

    # 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

##---------------End: proguard configuration for Gson  ----------

Prefs.java

...
    public static void storeInternalStudent(InternalStudent internalStudent) {
        Gson gson = new Gson();
        String json = gson.toJson(internalStudent);
        shared.edit().putString(SELECTED_INTERNAL_STUDENT_KEY, json).apply();
    }

    public static InternalStudent restoreInternalStudent() {
        Gson gson = new Gson();
        String json = shared.getString(SELECTED_INTERNAL_STUDENT_KEY, "");
        return  gson.fromJson(json, InternalStudent.class);
    }
...

build.gradle

    ...
        jackOptions {
                enabled true
            }
    ...
        compileOptions {
            incremental true
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    ...
compile 'com.google.code.gson:gson:2.8.0'

谁能帮我解决这个问题?我做错了什么?

【问题讨论】:

    标签: android gson android-proguard


    【解决方案1】:

    问题的原因是使用 Java8 的 Jack 工具链。当我拒绝 Jack 并返回到 retrolambda 时,GSON 反射方法的问题就消失了。

    【讨论】:

      猜你喜欢
      • 2011-12-29
      • 2016-11-06
      • 2015-10-11
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      相关资源
      最近更新 更多