解決android應用引用第三方jar包混淆打包報錯



1、project.properties文件中

取消這行註釋

#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt  

2、proguard-project.txt中

-libraryjars libs/   +    引用的jar包全名

例如:-libraryjars libs/android-support-v4.jar



  1. -dontwarn com.baidu.**  
  2. -keep class com.baidu.** { *;}  
  3.   
  4. -dontwarn com.lakala.**  
  5. -keep class com.lakala.** { *;}  
  6.   
  7. -dontwarn com.lingtu.**  
  8. -keep class com.lingtu.** { *;}  
  9.   
  10. -dontwarn com.autonavi.**  
  11. -keep class com.autonavi.** { *;} 


混淆以後,出現錯誤,每次看報錯信息,連方法都難找到。雖說有屬性對應的txt,但是有些混淆的方法名是一模一樣,所以找起來相當麻煩。

下面就把我遇見的問題分享出來吧。

第一個,類型轉換錯誤,因爲我用的泛型,所以在調用某些方法的時候,會出現這種錯誤,後面在混淆配置文件加了一個過濾泛型的語句,如下。

-keepattributes Signature

過後,就沒有出現類似的類型轉換錯誤。

第二個,空指針異常,這個錯誤是我對比前面的錯誤來說,所用的時間比較短,開始是找不到方法到底是哪個(原因是上面提到的混淆後方法名相同),所以就把這個類裏面的所有方法都過濾掉,這樣我沒用多少時間,也就找到了具體的方法,可還是不明白原因,後面發現了其中的一個if判斷,我利用反射篩選方法,關鍵字是“get”,突然我就震精了,大叫一聲——soga,原來我 model set/get方法名全部都被混淆了,所以篩選不到方法,返回的也就是null值,自然下面用到這個方法的返回值就會拋出空指針異常。

解決方法:把 model包下面的所有類,全部過濾掉。

總結:如要用到反射,反射一般就會利用到泛型,所以必須要把泛型的全部過濾掉,如果有根據變量名或者方法名判斷的,記得所在的類需過濾掉,之中還有用到 annotation的地方,要加入一行代碼,如下:

-keepattributes *Annotation*

這樣就能過濾掉所有的annotation,否則也會拋出空指針異常。



發佈了17 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章