关键词:
【中文标题】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【问题描述】:我正在尝试实现一个机器人环... 查看详情