Android java.lang.NoClassDefFoundError 错误解决方法 | 幸福的猪窝

Android java.lang.NoClassDefFoundError 错误解决方法

起因

最近项目中遇到了一个奇怪的现象,Android Studio编译环境运行良好,常用测试机运行也好好的。给同事重新编译后在两部测试机上运行时就报 java.lang.NoClassDefFoundError:org.slf4j.MDC.class 这个是我使用的日志库中的一个对象。明明都存在怎么就不行了。在网上找了很久后终于撞上了正确答案[1]。

总结一下这个问题的现象:

  1. 编译时没有任何问题。
  2. 运行时可能会随机出现找不到某个类的现象。且出现在Android 5.0以下版本 原因就是android 打包dex文件时65535方法数限制的问题,而且Android5.0以下版本需要添加特殊的方法处理才能兼容。

下面介绍具体解决办法: 我的问题在项目以前遇到过方法数超出过65535 所以在build.gradle文件的 defaultConfig 段定义了 multiDexEnabled true导致编译时并没有报错。 而我常用的开发用手机是一个5.0的版本所以开发过程中没有发现问题,同事测试的两部手机是4.4的版本结果全军覆没。

###解决方法如下:

  1. 在build.gradle中defaultConfig段中确认已经配置了 multiDexEnabled true
  2. 在build.gradle中添加一个引用compile ‘com.android.support:multidex:1.0.1’
  3. 如果自定义了Application类那么把父类由 android.app.Application 换成 android.support.multidex.MultiDexApplication
  4. 如果自定义了Application类并且继承自其它类那么添加一个重载方法,如下示例。

    1
    2
    3
    4
    protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this); // 本句是关键
    }
  5. 如果没有自定义Application类那么创建一个类继承自android.support.multidex.MultiDexApplication。并在AndroidManifest.xml文件的 标签中添加android:name属性指定即可(详细设置不再赘述)。 参考MultiDexApplication对象的代码:

    1
    2
    3
    4
    5
    6
    public class MultiDexApplication extends Application {
    public MultiDexApplication() { }
    protected void attachBaseContext(Context base)
    {
    super.attachBaseContext(base);
    MultiDex.install(this); } }

参考链接:
Android 出现java.lang.NoClassDefFoundError错误的一种解决方案

配置方法数超过 64K 的应用

  • 本文作者: Vincent Dong
  • 本文链接: 250.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!