我发布了一个由dexguard混淆的Android应用程序。一切似乎都很好,除了Galaxy Tab 3 10.1和只有Android 4.4,这是唯一一个向开发者控制台报告错误的设备。
我得到以下例外:
java.lang.RuntimeException: Missing type parameter.
at com.google.gson.reflect.TypeToken.<init>(:62)
at com....util.Helper$2.<init>(:398)
Helper.java类中的代码和第398行
return (Config) getSerializable(context, CONFIG, new TypeToken<Config>(){}.getType());
我的dexguard规则:
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
# Application classes that will be serialized/deserialized over Gson
# path to the config class: com/.../models/config/Config.java;
-keep class com....models.** { *; }
-keepattributes Signature
不仅我不能自己重现错误(我还有一个带有Android 4.2的Galaxy Tab 3,还没有更新),它只涉及上面提到的设备。
答案 0 :(得分:2)
我的解决方案是避免使用TypeToken并将dexguard更新到最新版本。
例如:
而不是
new Gson().fromJson(json, new TypeToken<Object>(){}.getType());
使用这个
new Gson().fromJson(json, Object.class);
答案 1 :(得分:1)
如果错误仅发生在一台设备上,则很可能是该设备上的错误。如果您在Saikoa向我们报告此类问题,最好是通过一个小样本项目,我们可以让DexGuard解决它。您可以检查使用最新更新构建是否会产生影响。
(我是DexGuard的开发者)
答案 2 :(得分:1)
可以使用不同的方法创建TypeToken实例(对于参数化类型List<User>
)来解决此问题:
Type collectionType =
TypeToken.get(
$Gson$Types.newParameterizedTypeWithOwner(null,
List.class, User.class)).getType();
new Gson().fromJson(json, collectionType);
gson的下一个版本(我假设为2.8)将允许您更轻松地输入:
Type collectionType =
TypeToken.getParameterized(List.class,
User.class).getType();
new Gson().fromJson(json, collectionType);
对于非参数化类,可以使用以下内容:
new Gson().fromJson(json, TypeToken.get(Config.class).getType());