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-2024 CODEPRJ.COM