先看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