我在我的应用程序中使用 retrofit2.0 和 simpleframework.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/
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案
请有人帮助我了解ruby应用程序如何管理应用程序的gemfile和rvmgemsets。如果我当前使用的是Gemset,安装了一堆gem,并且我的gemfile中也有gems,那么Ruby应用程序是使用gemfile中的gem还是应用程序的gemset中的gem? 最佳答案 要理解这一点,您需要退后一步,了解rubygems的一般工作原理。让我们从一个没有rvm或Gemfile的系统开始。当您通过“geminstall”安装gem时,它会进入系统gem位置。每当您编写ruby脚本并需要gem时,它就会从那里获取。现在假设
我们可以像这样在顶层调用Array方法Array(something)这对我来说很有意义,它是一个没有显式接收者的方法调用,并且在本例中是main的self被插入到方法调用的前面。但这不是等同于:Kernel.Array(something)这对我来说没有意义。由于在第一种情况下,对象main属于Object类,其中混入了Kernel模块,因此具有Array方法。但是在第二种情况下,我们在内核模块对象本身而不是主对象上调用Array方法,它们不是一回事吗?抱歉我的英语不好。 最佳答案 Kernel.Array是所谓的模块函数。模块函
我对Ruby的运算符感到困惑。它与==或===有何不同?任何综合示例/用例?谢谢。 最佳答案 是组合比较运算符。如果LHS等于RHS,则返回0;如果LHS大于RHS,则返回1;如果LHS小于RHS,则返回-1 关于ruby-与Ruby的运算符混淆,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4746129/
运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid
1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La
这个问题在这里已经有了答案:Rubyobfuscator[duplicate](3个答案)关闭9年前。我必须混淆ruby代码以隐藏敏感源。我需要朝着正确的方向前进才能实现我想要的,所以:是否有Python的pyc的Ruby替代品?,我在许多gem中看到了version.rbc文件。它是如何产生的?此过程是否适用于其他(复杂的,而不仅仅是简单的版本声明)类型的Ruby文件?RubyEncoder可以完成这项工作(可以吗?帮我解决这个问题),但它需要购买许可证。这就是为什么我会将其视为最后的手段。任何其他建议
我发现Ruby中的String#hex没有为给定的字符返回正确的十六进制值很奇怪。我可能误解了这个方法,但举个例子:'a'.hex=>10而“a”的正确十六进制值是61:'a'.unpack('H*')=>61我错过了什么吗?什么是十六进制?任何提示表示赞赏!谢谢 最佳答案 String#hex不会为您提供字符的ASCII索引,它用于将base-16数字(hexadecimal)从字符串转换为整数:%riString\#hexString#hex(fromrubysite)------------------------------
这个问题在这里已经有了答案:EncodingRubyonRailscode?(5个答案)关闭3年前。我刚刚开始使用RubyonRails开发,我有一个关于源代码“隐私”的问题。据我所知(我还没有做过部署,只是在本地开发环境中使用了RoR),当部署RoR应用程序时,所有源代码都是“可见的”"在服务器上?我怎样才能保护我的代码;可以这么说?我所说的保护是指,主要目的是某人(例如RoR提供商的服务器管理员)无法通过轻松找出代码中“摆弄”的位置来“破坏”代码与”。Shopify、Yellowpages等使用RoR的网站如何确保其代码未被“破坏”?更新我真正要寻找的是,假设如果我有一些进行信用卡