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

Posted

技术标签:

【中文标题】三星设备上的 Proguard“缺少类型参数”【英文标题】:Proguard "Missing type parameter" on Samsung device 【发布时间】:2015-01-06 14:45:02 【问题描述】:

我已经发布了一个被 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());

我的 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,尚未提供更新),它仅与上述设备有关。

【问题讨论】:

我在三星 Galaxy Tab 3 上有这个确切的问题,不完全确定该怎么做!也使用 dexguard。 我只在 Tab 3 10.1 上遇到了类似的问题,而且我也在使用 DexGuard。但显然这发生在 twitter 核心库中,而不是在我的代码中 【参考方案1】:

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

例如:代替

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

使用这个

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

【讨论】:

非常好,感谢您的跟进。我做了同样的事情,它似乎正在工作。但是,我使用的是参数化类型,例如 new TypeToken&lt;List&lt;User&gt;&gt;().getType(),所以在我的例子中 User.class 成功了。【参考方案2】:

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

(我是 DexGuard 的开发者)

【讨论】:

感谢您的支持。我会尽快联系您 我正在使用... Type type = new TypeToken>>() .getType(); ..这确实给了我这个列表,但我得到了 Station object null 我该怎么办【参考方案3】:

这个问题可以通过使用不同的方式创建 TypeToken 实例来解决(对于参数化类型List&lt;User&gt;):

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());

【讨论】:

以上是关于三星设备上的 Proguard“缺少类型参数”的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 proguard 混淆后,使用 google guice 注入不再起作用

JobIntentService 上的 IllegalArgumentException 主要在三星设备上

android中三星设备上的相机捕捉方向

某些三星设备上的编辑文本有限?

使用 MediaStore 存储图像会导致特定三星设备上的应用程序崩溃