Gson:缺少类型参数 - android应用程序中的proguard问题

     2023-04-15     71

关键词:

【中文标题】Gson:缺少类型参数 - android应用程序中的proguard问题【英文标题】:Gson: Missing type parameter - proguard trouble in android app 【发布时间】: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'

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

proguard 缺少类型参数

...2-2901:35:12【问题描述】:我尝试使用ProGuard混淆我的android应用程序代码。但在此之后,我的应用程序在运行时出现异常:11-1501:46:26.818:W/System.err(21810):java.lang.RuntimeException:Missingtypeparameter. 查看详情

android:gson通过借助typetoken获取泛型参数的类型的方法

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下。由于Java泛型的实现机制,使用了泛型的代码在运行期... 查看详情

三星设备上的 Proguard“缺少类型参数”

...淆的安卓应用。一切似乎都很好,除了GalaxyTab310.1和只有Android4.4,这是唯一向开发者控制台报告错误的设备。我得到以下异常:java.lang.Run 查看详情

Android - 改造 - 基本网址中缺少查询参数

...使用Dagger2+Retrofit+RxAndroid+OkHttp3+新架构组件开发一个android应用程序。最小SDK=16.问题:在API16上运行应用程序时,Url生成不正确。Url缺少我通过Ret 查看详情

我更新了一个应用程序,但它失败了。 ProGuard 中缺少类型参数

】我更新了一个应用程序,但它失败了。ProGuard中缺少类型参数【英文标题】:IupdatedanAppbutitsfailed.MissingtypeparameterinProGuard【发布时间】:2015-10-1111:04:22【问题描述】:我更新了一个代码几乎相同的应用程序,在以前的版本中我... 查看详情

使用 GSON 反序列化泛型类型

...发布时间】:2013-08-2604:20:52【问题描述】:在我的Android应用程序(使用Gson库)中实现Json反序列化时遇到一些问题我做过这样的课publicclassMyJson<T>publicList<T>posts;反序列化调用是:publicclassJsonDownloader& 查看详情

将意图类型添加到 android Flutter 清单会导致主屏幕中缺少应用程序图标

】将意图类型添加到androidFlutter清单会导致主屏幕中缺少应用程序图标【英文标题】:Addingintenttypetoandroidfluttermanifestleadstomissingappiconinhomescreen【发布时间】:2020-10-2019:45:30【问题描述】:我按照这里提到的示例代码androidintentsflut... 查看详情

播放模板中的“缺少参数类型”

】播放模板中的“缺少参数类型”【英文标题】:\'Missingparametertype\'inPlaytemplate【发布时间】:2016-02-1309:24:23【问题描述】:我在Play2.4.6(使用scala2.11.6和sbt0.13.8)中有以下模板定义块,并且我在以下代码中得到“缺少参数类型... 查看详情

gson使用

...ass);提供两个参数,分别是json字符串以及需要转换对象的类型。第二种,转换成列表类型:List<Person>ps=gson.fromJson(str,newTypeToken<List<Person>>().getType());可以看到上面的代码使用了TypeToken,它是gson提供的数据类型转换器... 查看详情

A 缺少类型注释。A 是在函数类型中声明的类型参数

】A缺少类型注释。A是在函数类型中声明的类型参数【英文标题】:MissingtypeannotationforA.Aisatypeparameterdeclaredinfunctiontype【发布时间】:2019-07-0519:19:42【问题描述】:我有以下代码:importcombineReducersfrom\'redux\';importplaneReducerfrom\'./plan... 查看详情

gson通过借助typetoken类来解决这个问题

...现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。但是有的时候,我们确实需要获知泛型参数的类型,比如将使用... 查看详情

类型错误:parse() 缺少 1 个必需的位置参数:'stream'

】类型错误:parse()缺少1个必需的位置参数:\\\'stream\\\'【英文标题】:TypeError:parse()missing1requiredpositionalargument:\'stream\'类型错误:parse()缺少1个必需的位置参数:\'stream\'【发布时间】:2021-08-0523:35:31【问题描述】:fromdjango.shortcu... 查看详情

Java中的泛型类缺少类型参数?

】Java中的泛型类缺少类型参数?【英文标题】:MissingtypeargumentsforgenericclassinJava?【发布时间】:2022-01-2116:52:53【问题描述】:我不明白如何将泛型类型格式化为这段代码:importnet.minecraft.client.renderer.entity.EntityRendererManager;importnet... 查看详情

实例:gson解析泛型对象(代码片段)

...generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。2)泛型使用泛... 查看详情

类型错误:预测()缺少 1 个必需的位置参数:'params'

】类型错误:预测()缺少1个必需的位置参数:\\\'params\\\'【英文标题】:TypeError:predict()missing1requiredpositionalargument:\'params\'类型错误:预测()缺少1个必需的位置参数:\'params\'【发布时间】:2019-09-0706:39:26【问题描述】:我建... 查看详情

类型错误:initialize() 缺少 1 个必需的位置参数:'url'

】类型错误:initialize()缺少1个必需的位置参数:\\\'url\\\'【英文标题】:TypeError:initialize()missing1requiredpositionalargument:\'url\'类型错误:initialize()缺少1个必需的位置参数:\'url\'【发布时间】:2020-04-1815:01:09【问题描述】:我不知道... 查看详情

如何修复“UUID 类型的方法参数缺少 URI 模板变量 'uuid'”?

】如何修复“UUID类型的方法参数缺少URI模板变量\\\'uuid\\\'”?【英文标题】:Howtofix\'"MissingURItemplatevariable\'uuid\'formethodparameteroftypeUUID"\'?如何修复“UUID类型的方法参数缺少URI模板变量\'uuid\'”?【发布时间】:2019-05-2923:5... 查看详情

类型错误:new() 缺少 1 个必需的位置参数:'y'

】类型错误:new()缺少1个必需的位置参数:\\\'y\\\'【英文标题】:TypeError:new()missing1requiredpositionalargument:\'y\'类型错误:new()缺少1个必需的位置参数:\'y\'【发布时间】:2021-08-0512:46:12【问题描述】:我正在尝试实现一个机器人环... 查看详情