Все еще получаю ту же ошибку.

ользуюretrofit2.0 в моем приложении сsimpleframework.xml библиотека.

Проблема в том, что когда я запускаю приложение без Proguard, оно работает нормально, однако, когда я запускаю Proguard, я получаю следующую ошибку в журналах.

E/ERROR: java.lang.RuntimeException: org.simpleframework.xml.core.PersistenceException: Constructor not matched for class A

Класс A не имеет конструктора / default, который должен работать. Еще я добавилБез аргументов конструктор, Но это не исправило проблему.

КлассA

@Root(name = "data",strict = false)
public class A {
    @Element(name = "baseurl",required = false)
    private String baseURl;
    @Element(name = "country_code")
    private String country_code;

    //  Setters and getters
}

Как видите, конструктора нет (добавление пустого конструктора по умолчанию сохраняет проблему). Так по умолчаниюБез аргументов конструктор должно работать так же хорошо. Однако я попытался с помощью следующего конструктора, и это устраняет ошибку.

public A(@ELement(name = "baseurl") String baseUrl,
         @Element(name = "country_code") String country_code) {    // Add all the elements from the xml in the constructor i.e. if a new element is added a new constructor would have to be written.
    baseURl = baseUrl;
    this.country_code = country_code;
}

Но у меня слишком много файлов для изменения, если я хочу сделать это таким образом. Кроме того, конструктор, требующий все сопоставленные значения, не должен быть обязательным. У меня довольно много классов, которые содержат более 50 переменных-членов (я упростил пример класса, включив в него только две переменные-члены). Этот класс содержит около 30, и код был бы слишком длинным, чтобы публиковать здесь.

Дело в том, что у меня есть множество классов, работающих в предположении конструктора No Argument для каждого класса.

Простое добавление конструкторов для всех неосуществимо.

мойproguard-rules.pro (только с соответствующими правилами обфускации lib).

#-keepattributes *Annotation*

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }

-dontwarn com.bea.xml.stream.**
-dontwarn org.simpleframework.xml.stream.**
-keep class org.simpleframework.xml.**{ *; }
-keepclassmembers,allowobfuscation class * {
    @org.simpleframework.xml.* <fields>;
    @org.simpleframework.xml.* <init>(...);
}

Возможно, стоит отметить, что до этой ошибки я получал

E/ERROR: java.lang.RuntimeException: org.simpleframework.xml.core.ElementException: Element 'version' does not have a match in class A at line 1

Решил, добавив аргумент «имя» в@Element Аннотация. Поэтому одной из причин, по которой я не хочу менять все файлы, является то, что, если появляется другая Ошибка.

РЕДАКТИРОВАТЬ 1: Поэтому после 2 дней поиска решения я сдался и, наконец, добавил конструкторы ко всем классам. Дело в том, что библиотека вызывает конструктор только для доступныхXML-теги, Скажи за вышеупомянутый класс А, если толькокод страны был доступен в XML

<xml>
    <data>
        <country_code>PK</country_code>
    </data>
</xml>

Тогда мне нужен конструктор с одним аргументом country_code, чтобы он работал

public A(@Element(name = "country_code") String country_code) {
    this.country_code = country_code;
}

Что делает найденное решение непригодным для использования.

РЕДАКТИРОВАТЬ 2: Найден обходной путь! Хранение классов POJO в правилах Proguard исправляет эту ошибку. Но я бы предпочел не держать эти занятия.

И поэтому я держу этот вопрос открытым, по крайней мере, пока, или пока кто-нибудь не скажет мне, почему я должен хранить эти файлы.

Ответы на вопрос(1)

Ваш ответ на вопрос