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


私のデックスガードのルール:

# 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

この問題は、別の方法を使用して 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 に答える
1

エラーが 1 つのデバイスでのみ発生する場合は、そのデバイスのバグである可能性が高くなります。そのような問題を、できれば小さなサンプル プロジェクトで Saikoa に報告していただければ、DexGuard で問題を回避できる可能性があります。最新のアップデートでビルドすると違いが生じるかどうかを確認できます。

(私は DexGuard の開発者です)

于 2014-11-11T00:24:02.493 に答える