天天看点

Proguard 混淆的一些经验教训!!!

混淆工具 proguard 前后接触一段时间了,差不多了是明白了,不过遇到很多坑,差点被跳不出来坑了!真的难学啊! 真是是太难了;

教训1  ServerKeyStore 是kotlin类,不能 进行普通的混淆。 

原因分析:反编译可以看到ServerKeyStore 的很多信息丢失了,被变成了java 类,但是人家本来就不是java类; 而且kotlin 的一下特有的注解 也不见了;

解决方案:需要保留kotlin 特性 

教训2   匿名内部类,被重命名了为a、b、c之类,方法的实现、继承全部失效,而且不抛错误!

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type '...service.ConfigManager' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

Proguard 混淆的一些经验教训!!!
Proguard 混淆的一些经验教训!!!

View Code

原因分析:因为它不是public 类,本来需要一个, 结果找不到,因为混淆之后,某些package 没有被扫描到! 混淆之后 原来继承jetty框架的类, 因为是内部类,被重命名了为a、b、c之类的导致 相当于没有继承,从而没有执行,从而导致了 严重问题!

解决方案:需要保留某些内部匿名类、非public内等

教训3  private 方法,混淆之后被重命名,hibernate 反射访问出错:

 Could not find a setter for property groupLinks in class ...domain.User

Proguard 混淆的一些经验教训!!!
Proguard 混淆的一些经验教训!!!

原因分析:本来需要一个 setGroupLinks, 结果因为 setGroupLinks 是 private 方法,混淆之后被重命名..  ———— 没想到 hibernate需要对 private 方法进行反射, 实在没想到。

解决方案:需要保留persistent层 hibernate用到的一些 domain 类 的private  属性

教训4 无法进行转换: Cannot convert value of type '...$$..' to required type '...'

Proguard 混淆的一些经验教训!!!
Proguard 混淆的一些经验教训!!!

原因分析:注意看,错误是 : Cannot convert value of type '...service.impl.AccountManagerImpl$$..' to required type '...persistence.UserDAO, 简直不可思议, 为什么会进行 AccountManagerImpl 和 UserDAO 的转换? 猜测是因为 userManager 的构造器有多个参数, 混淆之后 参数名字丢失, 无法 根据applicationContext-service.xml进行名字的设定,所以出现了这等奇怪问题;

解决方案:  UserManager 及 UserManagerImpl 等service类不进行任何的混淆.. 暂时只能这样。

教训4  需一个类, 结果却有多个:

biz.papercut.pcng.server.config.CommonConfig#propertyConfigurer

propertyConfigurer 方法需要一个 Properties , 结果发现有多个:

Proguard 混淆的一些经验教训!!!

原因分析:反编译可以看到 propertyConfigurer 方法的参数名字已经丢失了,不知道为什么, 本来应该是 bootstrapProperties, 结果却..   猜测是 不能通过name进行自动注入,于是只能通过type,但是可选的 type有多个, 故出现错误..

解决方案: 保留必要的方法签名, 包括名字、参数

...

我的配置参考:

注意 

dontwarn不能出现多次, 否则以后者为准 ,忽视前面的, Proguard 这个配置 非常蛋疼, 一不小心结果面目全非。