android小知識——Android混淆打包及混淆後運行錯誤

Android引用第三方jar包混淆時打包報錯(can't find referenced class)

           項目打包的時候,總是失敗,提示Proguard returned with error code 1. See console。然後看控制檯,報出好多can't find referenced class......

場景:項目中引用了第三方的jar包

原因:第三方jar包中引用了好多oracle發佈的java標準中(也就是我們常用的JDK)包含的類,但是Android的java標準和oracle的不一樣,android.jar裏面去掉了oracle java標準中好多用不到的包和類。

解決辦法:首先要把你項目中所引入的第三方jar包使用"-libraryjars 包路徑"指定好。然後,用-dontwarn com.xx.bbb.**
-keep class com.xx.bbb.** { *;}告訴proguard.cfg不用混淆指定的jar包,也不用提示這個包所報出的錯。這樣就ok了。

注意:要是用dontwarn取消指定包報錯之前,你要保證第三方引用的類在你的項目中沒有用到。

 Android混淆後項目運行的時候出現異常(混淆之前沒有該異常)

        1、ClassNotFoundException,NoSuchMethodError

        原因:這種異常會在好多情況下出現,比如:本地代碼通過反射調用其他的類,但是經過了混淆之後,就會出現如上異常;調用了JNI之後,C或者C++和java代碼進行交互的時候找不到java的類或者方法,導致發生了異常......等等,還有好多。

        解決辦法:只需要將被調用的java類標註爲不混淆即可。 -keep class package.classname{*;}

        2、ExceptionInInitializerError

       原因:這是由於類初始化的時候發生了異常。

       解決辦法:找到具體是哪裏的類哪個方法哪個類初始化的時候發生的異常,然後解決問題。

        注:遇到這個錯誤,首先要確認是不是因爲第三方的jar包導致的。如果不是的話,就找本地代碼,看是不是寫的有問題。如果確實是因爲第三方jar包的代碼導致的,儘量找到源碼或者反編譯,查看問題到底是什麼引起的,然後找到相應的配置在proguard裏面配置。

        例如:我們項目中碰到過一個問題,就是因爲第三方的jar包裏面有一個字段初始化的時候報了空指針,然後導致我們的代碼報了上面的錯。當時很奇怪,爲什麼第三方的jar包還能報錯,最後調查了之後才發現,是因爲人家用到了類的註解,而proguard在混淆優化的時候把註解去掉了,所以報了空指針,只需要在proguard裏面加上保護註解就可以了-keepattributes *Annotation*

          3、 ClassCastException

       原因:類強制轉換的時候出錯。

       解決辦法:找到代碼,看是代碼寫的問題,還是混淆後的問題。如果沒有混淆正常運行的話,一般都是因爲混淆後遇到了各種問題才報的錯。我們項目中遇到的問題是因爲沒有讓proguard保持泛型,所以強轉的時候報錯。只需要在proguard文件裏面加上泛型即可-keepattributes Signature

4、Resources$NotFoundException(resource not found)資源沒有找到,是因爲第三方jar包或者自己的代碼是通過反射獲得R文件中的資源,所以需要將R文件屏蔽掉    原因:代碼進行了混淆,R文件沒有了,所以通過反射獲取的R文件找不到    解決辦法:在proguard文件裏設置不混淆R文件    -keep class **.R$* { *; }

大家如果遇到其他的異常,可以在下面提出來,希望可以幫助大家解決問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章