先看Log,由于混淆无法查看具体代码行,但通知反编译能大概猜到是哪个类里面报的错;但由于不是具体的异常,无法断定是什么问题。
E/AndroidRuntime(19738): java.lang.VerifyError: com/less/more/download/bcE/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;)VW/dalvikvm(19738): VFY: rejecting opcode 0x74 at 0x04f3W/dalvikvm(19738): VFY: rejected Lcom/less/more/download/bc;.a (Landroid/content/Intent;)VW/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