4

我已经发布了一个被 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,更新尚不可用),它只涉及上述设备。

4

3 回答 3

2

我的解决方案是避免使用 TypeToken 并将 dexguard 更新到最新版本。

例如:

代替

new Gson().fromJson(json, new TypeToken<Object>(){}.getType());

用这个

new Gson().fromJson(json, Object.class);
于 2015-01-22T08:10:40.647 回答
1

如果错误仅发生在一台设备上,则很可能是该设备上的错误。如果您在 Saikoa 向我们报告此类问题,最好是通过一个小型示例项目,我们也许可以让 DexGuard 解决它。您可以检查使用最新更新进行构建是否有所作为。

(我是 DexGuard 的开发者)

于 2014-11-11T00:24:02.493 回答
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());
于 2016-09-23T15:47:24.120 回答