android开发Proguard混淆与反射
http://charles-tanchao.diandian.com/post/2012-05-24/20118715
由于前面開發數據操作類,所以利用反射,封裝了一個BaseDao,本來在平常的時候,調試都沒有出問題,可是直到用了?Proguard混淆以后,就出現各種錯誤,最開始是類型轉換錯誤,到了后面就變成空指針異常,并且已經發布出去,手機上不調試,所以就只能把報錯信息保存到文件中,每次查看。
混淆以后,出現錯誤,每次看報錯信息,連方法都難找到。雖說有屬性對應的txt,但是有些混淆的方法名是一模一樣,所以找起來相當麻煩。
下面就把我遇見的問題分享出來吧。
第一個,類型轉換錯誤,因為我用的泛型,所以在調用某些方法的時候,會出現這種錯誤,后面在混淆配置文件加了一個過濾泛型的語句,如下。
-keepattributes Signature過后,就沒有出現類似的類型轉換錯誤。
第二個,空指針異常,這個錯誤是我對比前面的錯誤來說,所用的時間比較短,開始是找不到方法到底是哪個(原因是上面提到的混淆后方法名相同),所以就把這個類里面的所有方法都過濾掉,這樣我沒用多少時間,也就找到了具體的方法,可還是不明白原因,后面發現了其中的一個if判斷,我利用反射篩選方法,關鍵字是“get”,突然我就震精了,大叫一聲——soga,原來我?model的?set/get方法名全部都被混淆了,所以篩選不到方法,返回的也就是null值,自然下面用到這個方法的返回值就會拋出空指針異常。
解決方法:把?model包下面的所有類,全部過濾掉。
總結:如要用到反射,反射一般就會利用到泛型,所以必須要把泛型的全部過濾掉,如果有根據變量名或者方法名判斷的,記得所在的類需過濾掉,之中還有用到?annotation的地方,要加入一行代碼,如下:
-keepattributes *Annotation*這樣就能過濾掉所有的annotation,否則也會拋出空指針異常。
Proguard官方都有說具體要過濾什么,所以還是要多看看官方的說明啊~
總結
以上是生活随笔為你收集整理的android开发Proguard混淆与反射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RocketMQ topic路由
- 下一篇: C#中HttpClient使用注意:预热