Android解決混淆打包之後註解被去掉的問題
一、實驗環境(藍色粗體字為特別注意內容)
1,環境:Eclipse+ADT
2,參考文獻:
①https://blog.csdn.net/yhtppp/article/details/44059519?utm_source=blogxgwz0
②http://liucanwen.iteye.com/blog/2026400
③https://www.jianshu.com/p/bc70d5d71a61
我們都知道Android中是通過findViewById()這個方法來繫結xml中的控制元件的。但是當控制元件較多時,findViewById()的程式碼行數也會隨之增多,而且這些findViewById函式並沒有表示其他特殊的含義。因此,activity中大量重複的findViewById()方法就導致了整個程式碼看起來很臃腫。於是在一個專案中,按照參考文獻③的方式,使用註解代替findViewById方法,於是問題隨之而來,在Eclipse中直接點執行,下載到手機中的時候一切正常,但是匯出簽名之後的apk則執行閃退,甚是奇怪。
檢視日誌發現,是使用ViewInject註解的控制元件全爆空指標。即如下方式的控制元件都有問題
@ViewInject(R.id.btn_login)
/**登入按鈕*/
private Button btn_login;
多方查詢原因,最後定位到是匯出APK程式碼混淆的時候配置不當所致。
為了驗證這個猜想,我把混淆前的反編譯程式碼跟混淆後的反編譯程式碼進行對比,這一對比就發現了問題所在:
未混淆前:
混淆之後:
可以看到混淆打包之後註解全都被去掉了!!!
於是按照參考文獻①②的思想,在proguard-project.txt中加入下面的程式碼問題解決
# 不混淆使用了註解的類及類成員 -keep @com.pang.view.base.annotation.ViewInject class * {*;} # 如果類中有使用了註解的方法,則不混淆類和類成員 -keepclasseswithmembers class * { @com.pang.view.base.annotation.ViewInject <methods>; } # 如果類中有使用了註解的欄位,則不混淆類和類成員 -keepclasseswithmembers class * { @com.pang.view.base.annotation.ViewInject <fields>; } # 如果類中有使用了註解的建構函式,則不混淆類和類成員 -keepclasseswithmembers class * { @com.pang.view.base.annotation.ViewInject <init>(...); } # The "Signature" attribute is required to be able to access generic types whencompiling in JDK 5.0 and higher. -keepattributes Signature # processing Annotations -keepattributes *Annotation*
其中,“com.pang.view.base.annotation.ViewInject”是我自定義的註解類。
其他註解應該也是一樣的, 混淆程式碼生成apk時,一直無法正常開啟,出現問題,這時候,可以試試以上方法。混淆之後,一切正常,效果如下: