之前用环信写过包含即时通讯功能的APP,可是没有出现过在Android 5.0以下初始化失败的情况,而且使用的都是环信3.X的SDK。
先来看一下我遇到的错误
java.lang.NoClassDefFoundError: com/superrtc/call/AudioTrack
java.lang.ClassNotFoundException: Didn't find class "com.superrtc.call.AudioTrack" on path: /data/app/com.XXX.XXX.apk
下面分享一下我解决问题的心路历程,想看解决方法的直接跳到文章结尾就好了。
问题大概都是提示ClassNotFound之类的问题,最开始我以为是.so文件与极光的SDK发生了冲突,于是我copy了一份代码出来,移除了极光之后还会出现这种问题。
随后有重新配置了以下混淆的proguard配置文件,问题依旧。
后来我查看了一下提示出来的类,上面都有注释@TargetApi(21),于是我百度了一下环信5.0以下初始化失败,有几位博主给出了同样的结局方案就是在Application的onCreate方法中super.OnCreate();方法前加一句话MultiDex.install(this);就可以了,但是都没有给出具体的原因。确实在Android 5.0以下的环境可以启动App了,但是问题又出现了,在Android 5.0以上的手机中出现了下面的问题
Error:(10, 32) 错误: 程序包android.support.multidex不存在
重点,下面才是完整的解决方法!!!
实际上这个问题是因为Android工程方法数量超过了65536的限制
下面给出解决方法:
Step1:
在gradle的配置文件中添加依赖 compile 'com.android.support:multidex:1.0.1'
Step2:
添加 multiDexEnabled true
android {
...
defaultConfig {
...
multiDexEnabled true
...
}
}
Step3:
在工程的MainApplication中重写 attachBaseContext() 方法
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}