记录自己遇到的代码混淆问题(spring boot项目代码混淆):
1、由于引入框架,比如JDO,spring boot,有些方法是框架去调用,所以这些是不能够被混淆的。
比如自己编写的转换类:
public class ListStringToStringConverter implements AttributeConverter<List<String>, String> {
@Override
public String convertToDatastore(List<String> attributeValue) {
return CollectionUtils.isEmpty(attributeValue) ? JacksonUtils.toJson(new ArrayList<>())
: JacksonUtils.toJson(attributeValue);
}
@Override
public List<String> convertToAttribute(String datastoreValue) {
if (StringUtils.isBlank(datastoreValue)) {
return new ArrayList<>();
}
return JacksonUtils.fromJson(datastoreValue, new TypeReference<ArrayList<String>>() {
});
}
}
AttributeConverter来自javax.jdo.AttributeConverter,是jdo需要去调用的,代码混淆后这些override的方法是不能够被混淆的,否则jdo调用不到,报错。
要用 -keep public class 具体的类{*;} 保持类不被混淆
2、当代码中遇到了多个catch exception的时候,proguard代码混淆会触发bug。代码存在下面这种
try
{
// code
}
catch (IOException | InvalidFormatException e)
{
LOG.error(e);
throw new RuntimeException(e);
}
报错信息是:
java.lang.VerifyError: Bad type on operand stack
即使keep这个报错的类 也无法消除这个报错。后续找到这个bug的讨论,发现我的这个类里面确实含有多个catch exception的情况
这是这个bug的讨论
解决办法:bug的讨论里面Eric给出了一种解决办法,如下
但由于项目的jdk版本不能随意改,所以我只有将代码中的多个catch Exception改掉,只用一个Exception。