Все еще получаю ту же ошибку.
ользую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 исправляет эту ошибку. Но я бы предпочел не держать эти занятия.
И поэтому я держу этот вопрос открытым, по крайней мере, пока, или пока кто-нибудь не скажет мне, почему я должен хранить эти файлы.