天天看點

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 這個配置 非常蛋疼, 一不小心結果面目全非。