gson Samsung设备上的Proguard“缺少类型参数”

b91juud3  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(182)

我已经发布了一个安卓应用程序,用dexguard进行了模糊处理。一切看起来都很好,除了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());

我的准则是:


# 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,更新还未提供),它只涉及到上述设备。

v8wbuo2f

v8wbuo2f1#

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

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

用这个

new Gson().fromJson(json, Object.class);
gz5pxeao

gz5pxeao2#

如果错误只发生在一个设备上,则很可能是该设备上的bug。如果您向Saikoa的我们报告此类问题,最好提供一个小的示例项目,我们可能会让DexGuard解决它。您可以检查使用最新更新进行构建是否会有不同。
(我是DexGuard的开发者)

kx5bkwkv

kx5bkwkv3#

可以通过使用不同的方法创建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());

相关问题