MultiDex使用中导致的crash(VerifyError)问题解决方案

来源:互联网 发布:js构造函数prototype 编辑:程序博客网 时间:2024/05/16 18:42

关于问题描述

在项目中遇到一个奇葩的问题,多台测试机测试,其中有一台直接crash(点个名vivo的手机),并且报以前没有见到过的Error类型java.lang.VerifyError,下面是log截图:
这里写图片描述
在网上百度了一番之后,众说纷纭,现在马上都已经是2017年了,所以排除了一些关于eclipse的解决方案,我用的是AS,其中有两篇文章还是很有用的:
http://blog.csdn.net/zhuobattle/article/details/47153025
以及
http://blog.csdn.net/zhuobattle/article/details/52958364
好了,相面直接说说我的分析和解决方法了。

分析及解决方案

简单分析
首先看到log之后,log中报错的地方似乎和常见的错误不太一样,其中重要的信息有Could not find class,这是一个非常有效的信息,意思都明白,没有找打相关的类,why?我的这个项目可是一个已经上线的项目移植过来的,好吧,想了想,估计是项目第三方sdk比较多,导致程序又庞大了不少,原来程序就因为API数超过了64K,而分成了两个dex, 用的是MultiDex,最终导致crash!!!

解决方案
用MultiDex来突破64K的method id数量的限制,具体实现步骤如下:

1. 在Module的build.gradle里添加multiDexEnabled true
例如:

defaultConfig {        applicationId "com.baidu.my"        minSdkVersion 14        targetSdkVersion 24        versionCode 1        versionName "1.0"        // dex突破65535的限制        multiDexEnabled true    }

2. 接着在Module的build.gradle里添加

dependencies {  compile 'com.android.support:multidex:1.0.1'}

3. 第三步有两种情况
1)如果你的apk没有定义application,则在AndroidManifest.xml里的application里做如下修改:
添加MultiDexApplication(因为是具体项目,这个方式并没有测试)

<application        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme"        android:name="android.support.multidex.MultiDexApplication"        tools:replace="android:icon, android:name"       >

2)第二种也就是大家最常用到的方式了,在自定义的application中复写方法,具体如下

@Override    protected void attachBaseContext(Context base) {        super.attachBaseContext(base);        MultiDex.install(this);    }

结束

好了,至此,重新再在vivo上跑一遍,终于不crash了,如果你也遇到和我一样的问题,希望你也顺利解决哦。

0 0
原创粉丝点击