java.lang.VerifyError 異常解決方法


  先看Log,由於混淆無法查看具體代碼行,但通知反編譯能大概猜到是哪個類里面報的錯;但由於不是具體的異常,無法斷定是什么問題。

E/AndroidRuntime(19738): java.lang.VerifyError: com/less/more/download/bc
E/AndroidRuntime(19738):        at com.less.more.download.aw.run(Unknown Source)
E/AndroidRuntime(19738):        at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime(19738):        at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(19738):        at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime(19738):        at android.os.HandlerThread.run(HandlerThread.java:61)

  首先說明一下,我的包是使用ant進行打包的,之前一直都沒有出現問題,今天運行突然報這個錯;出現錯誤,首先是找從上一個版本到這個版本都改了哪些問題,這樣一個修改記錄慢慢定位,發現確實是其中的一條修改導致的,把該條修改恢復再次打包,運行OK;看看該條有問題的修改記錄,沒有發現任何異樣;真想不出來是什么問題引起的;通過google找了各種解決方法,好像都與我這個問題無關,盡管log及現象是一樣的。

  先匯總網絡上的相關解決方法:

http://blog.csdn.net/bill_ming/article/details/8799061

http://blog.csdn.net/wudiwo/article/details/7548451

  下面我們來具體分析一下本人遇到這個問題

使用adb logcat能發現在崩潰之前有一段警告的log

W/dalvikvm(19738): VFY: Ljava/lang/Object; is not instance of Ljava/lang/String;
W/dalvikvm(19738): VFY: bad arg 6 (into Ljava/lang/String;)
W/dalvikvm(19738): VFY:  rejecting call to Lcom/less/more/util/ag;.a (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
W/dalvikvm(19738): VFY:  rejecting opcode 0x74 at 0x04f3
W/dalvikvm(19738): VFY:  rejected Lcom/less/more/download/bc;.a (Landroid/content/Intent;)V
W/dalvikvm(19738): Verifier rejected class Lcom/less/more/download/bc;
W/dalvikvm(19738): threadid=14: thread exiting with uncaught exception (group=0x41638d88)

當然我們通過這個log,再根據反編譯的smail文件,可以定位到具體的函數,但實際上該函數是沒有任何問題;並且崩潰異常的地方並沒有執行到該函數;所以這就涉及到另外一個問題:

一個類被實例化時,會檢查該類中所有方法及變量的合法性?僅猜測而已;回到正題

既然沒有問題,那怎么會報這個錯呢?可以再次搜索,不過關鍵詞是

Ljava/lang/Object; is not instance of Ljava/lang/String

果然,能找到類似的問題,

http://stackoverflow.com/a/20999441/1043256

該問題提到一點“There are other posts that suggest there might be a ProGuard bug involved.”引起了我的懷疑,順藤摸瓜,就找到了一個關鍵的帖子

http://sourceforge.net/p/proguard/bugs/456/

原來這真是proguard中4.x上的一個bug;找到問題了,那解決方法就好辦了;

在開源proguard   http://sourceforge.net/p/proguard/下載最新版本的proguard,解壓后,放到xxx\android-sdk-windows\tools目錄中,刪除原來的那個proguard目錄,把新版本的proguard目錄改名成progurad;然后再次編譯,果然問題不見了;只能說一句google真坑爹啊,新版本都已經5.2.1了,sdk里面帶的還是4.7

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM