ProGuard混淆常見錯誤

一、Proguard returned with error code 1. See consolejava

  • 更新proguard版本android

  • android-support-v4 不進行混淆ide

  • 添加缺乏相應的庫google


二、使用gson包解析數據時,出現missing type parameter異常spa

  • 在 proguard.cfg中添加指針

-dontobfuscate
-dontoptimize

  • 在 proguard.cfg中添加code

# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }


三、類型轉換錯誤orm

-keepattributes Signature

 

四、空指針異常內存

混淆過濾掉相關類與方法ci


五、安卓代碼混淆與反射衝突,地圖沒法顯示等問題解決及反編譯方法,安卓反編譯此前的代碼混淆,由於並無用到反射,因此常規的代碼混淆方式一遍就能經過,而此項目中某些類利用到了反射機制(本人的這個項目中有即時通信功能,因此有表情類資源,所以須要經過反射由文件名找到表情資源id),當由文件名去尋找資源id時就報空指針異常了,期初我並不知道什麼緣由,經過反編譯已經混淆的apk,一步一步尋找到出錯的地方,才恍然大悟,正是反射那一步出現了問題:Field field = R.drawable.class.getDeclaredField(name);走到這一步就掛了,程序直接崩潰。

解決辦法:

  • 在proguard.cfg文件中,將反射用到的類中的變量不被混淆:

如:-keep public class com.byl.bean.Expressions { *; },表示Expressions 這個類及類中的全部變量及方法不被混淆,注意要寫全路徑;

  • 過濾泛型:

-keepattributes Signature

  • 最重要的一點:保持R文件不被混淆,不然,你的反射是獲取不到資源id的

-keep class **.R$* {*;}


補充一下:上個問題解決後,接下來又遇到了一個問題就是混淆後,地圖沒法正常使用了,博主使用的是百度地圖,在proguard.cfg也已經寫明瞭:

-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}


六、android.provider.Settings$Global

# Project target.
target=android-19


七、java.lang.reflect.UndeclaredThrowableException

-keep interface com.dev.impl.**


八、內存溢出和沒法寫入堆棧

javaOptions in proguard := Seq(...)
or
javaOptions in (Proguard, proguard) := Seq(...)

 

九、Error: Unable to access jarfile ..libproguard.jar

路徑問題


十、java.lang.NoSuchMethodError

沒有相關方法,方法被混淆了,混淆過濾掉相關方法即可。

相關文章
相關標籤/搜索