1. 程式人生 > >Android解決混淆打包之後註解被去掉的問題

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時,一直無法正常開啟,出現問題,這時候,可以試試以上方法。混淆之後,一切正常,效果如下: