关于问题描述
在项目中遇到一个奇葩的问题,多台测试机测试,其中有一台直接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了,如果你也遇到和我一样的问题,希望你也顺利解决哦。