关于java.lang.verifyerror的另外一种错误原因,解决方案

Posted by HaoChen Blog on October 25, 2016

今天解决的重大的问题 Android开发过程中,碰到了一个crash bug,照理说,程序开发碰到crash没什么大不了,看堆栈定位原因,然后解决即可但是这个堆栈刚看到的时候,还是愣了一下,如下:

java.lang.VerifyError 日志表明是一个类找不到

找到了看到了一条比较有价值的提示,unable to find class referenced in signature ,后面的类名涉及公司程序,去掉了。

看来应该是在dex里没找到对应的那个类,这个时候,我想起来了,最近项目新增加了一个比较大的第三方sdk,导致程序又庞大了不少,原来程序就因为API数超过了64K,而分成了两个dex, 用的是MultiDex,自动打包成class.dex和class2.dex.

逆向解压编译的APK,发现提示那个找不到的class,果然不在class.dex中,而是在class2.dex中。原因是我虽然分包了但是一些依赖包,和配置没有配好导致的.

解决办法:https://developer.android.com/studio/build/multidex.html

  1. 添加依赖:

     dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.android.support:design:24.1.1'
    compile 'com.android.support:multidex:1.0.0'
    }
    

2.配置Application类

		  <application
		    android:name="android.support.multidex.MultiDexApplication"
		    android:allowBackup="false"
		    android:icon="@mipmap/ic_launcher"
		    android:label="@string/app_name"
		    android:supportsRtl="true"
		    android:theme="@style/AppTheme">
  1. 改变Application的继承关系

     /**
      * Created by J_X on 2016/8/9.
      * Break 65K methods limits
      */
     public class MyApplication extends MultiDexApplication{
     @Override
     protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
     }
     }
    

简单暴力搞定