由集成极光推送引发的java.lang.NoClassDefFoundError

项目推送要换成极光推送,接入之后就说方法超过了64k,虽然去除之前不必要的依赖可能会解决问题,

但既然出现了,就解决一下,多了解点东西。于是乎,就开始了。

1.添加依赖于你的build.gradle支持MultiDex库

compile 'org.robolectric:shadows-multidex:3.3.2'

2.开启multiDexEnabled

在defaultConfig{…}中添加

multiDexEnabled true

然后我以为就这样就可以了,于是就开始尝试运行。但是问题出现了,在 4.x 的测试机上运行后会提示标

题中的错误,就是类找不到;但是在自己6.0的手机上运行就可以。进一步测试,发现测试机上将混淆开启

后也可以正常运行。刚开始还以为是我混淆配置文件的问题,后来想想也不对,不然不会只在6.0的手机上

可以运行。于是直接搜索错误,看到了有说dex分包的问题,试过后才知道错误的真正原因。

原来以前只知道方法超过64k要分包,要添加依赖,但不知道还要有其他配置。参考如下:

DEX 方法超过64K限制和gradle编译OOM问题解决

这里再复制一下,方便查看:

1.如果项目中没有创建自己的Application 类,可以在清单文件AndroidManifest.xml中配置

android.support.multidex.MultiDexApplication 就可以了。

android:name="android.support.multidex.MultiDexApplication" 

2.如果项目中有自己的Application类了,可以让它继承 android.support.multidex.MultiDexApplication。

或者继承Application 类。在 attachBaseContext()/onCreate() 中添加

MultiDex.install(this);

如:

  @Override

    protected void attachBaseContext(Context base) {

        super.attachBaseContext(base);

        MultiDex.install(this);

    }

这样,在 4.x 的机器上就可以正常运行了。

至于为什么在6.0的手机上可以正常运行,可能是因为 Android 5.0 以后的atr虚拟机和 dalvik 虚拟机的模

式不一样的原因吧;而为什么在 4.x 的手机上开启混淆就可以正常运行,这个原因还是不清楚。希望知道

原因的大神指导我一下,谢谢!

你可能感兴趣的:(安卓)