gpt4 book ai didi

android - 混淆器 - PersistenceException : Constructor not matched for class

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:31 26 4
gpt4 key购买 nike

我在我的应用程序中使用 retrofit2.0simpleframework.xml 库。

问题是当我在没有 proguard 的情况下运行应用程序时它工作正常但是当我运行 proguard 时我在日志中收到以下错误。

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

类 A 没有/默认构造函数应该可以工作。我仍然添加了一个No Argument Constructor。但这并没有解决问题。

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
}

如您所见,没有构造函数(添加默认的空构造函数可以解决问题)。所以默认的 No Argument Constructor 应该也能正常工作。但是我尝试使用以下构造函数,这消除了错误。

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 个代码,代码太长而无法在此处发布。

问题是我有很多类在假设每个类都没有参数构造函数的情况下工作。

简单地为所有添加构造函数是不可行的。

我的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 注解中添加 'name' 参数解决了这个问题。所以我不愿意更改所有文件的原因之一是如果出现另一个错误怎么办。

编辑 1:因此,在寻找解决方案 2 天后,我放弃了,并最终将构造函数添加到所有类中。问题是库只为可用的 xml-tags 调用构造函数。如果只有 country_code 在 xml 中可用,则对于上述 A 类

<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 类保留在混淆规则中可以修复此错误。但我宁愿不保留这些类(class)。

所以我至少暂时保留这个问题,或者直到有人告诉我为什么我应该保留这些文件。

最佳答案

我猜你的问题是你没有保留任何属性,这显然取决于你使用的属性。就我而言,这就是我处理它的方式,让我知道它是否适合您:

## https://square.github.io/retrofit/ ##
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}

## Simple XML ##
-dontwarn org.simpleframework.xml.stream.**
-keep public class org.simpleframework.** { *; }
-keep class org.simpleframework.xml.** { *; }
-keep class org.simpleframework.xml.core.** { *; }
-keep class org.simpleframework.xml.util.** { *; }

-keepattributes ElementList, Root, *Annotation*

-keepclassmembers class * {
@org.simpleframework.xml.* *;
}

关于android - 混淆器 - PersistenceException : Constructor not matched for class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47407587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com