Proguard Отсутствует параметр типа на устройстве Samsung

Я опубликовал приложение для Android, запутанное 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


Мало того, что я не могу воспроизвести ошибку сам (у меня также есть Galaxy Tab 3 с Android 4.2, обновление еще не доступно), она касается только вышеупомянутого устройства.


person LuckyMalaka    schedule 10.11.2014    source источник
comment
У меня точно такая же проблема на Samsung Galaxy Tab 3, не совсем уверен, что делать! Также использую дексгард.   -  person Tom Redman    schedule 21.01.2015
comment
У меня похожая проблема только на вкладке 3 10.1, и я тоже использую DexGuard. Но, видимо, это происходит внутри основной библиотеки твиттера, а не в моем коде.   -  person Luca Looz    schedule 02.01.2017


Ответы (3)


Мое решение состояло в том, чтобы избежать использования TypeToken и обновить dexguard до последней версии.

Например:

Вместо

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

используйте это

new Gson().fromJson(json, Object.class);
person LuckyMalaka    schedule 22.01.2015
comment
Отлично, спасибо за продолжение. Я сделал то же самое, и, похоже, это работает. Однако я использовал параметризованные типы, например, new TypeToken<List<User>>(){}.getType(), поэтому в моем случае User.class сделал свое дело. - person Tom Redman; 26.01.2015

Если ошибка возникает только на одном устройстве, скорее всего, это ошибка на этом устройстве. Если вы сообщите нам в Saikoa о таких проблемах, желательно с небольшим примером проекта, мы можем позволить DexGuard решить эту проблему. Вы можете проверить, имеет ли значение сборка с последним обновлением.

(Я разработчик DexGuard)

person Eric Lafortune    schedule 11.11.2014
comment
Спасибо за Вашу поддержку. Я свяжусь с вами в ближайшее время - person LuckyMalaka; 14.11.2014
comment
Я использую... Type type = new TypeToken‹HashMap‹String, ArrayList‹Station›››() { }.getType(); .. который дает мне этот список, но я получаю объект Station null, что мне делать - person Pankaj Nimgade; 22.02.2016

Эту проблему можно решить, используя другой способ создания экземпляра 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());
person T. Neidhart    schedule 23.09.2016