NoClassDefFoundError with Android Studio

在android studio上面,运行android项目的时候,在我电脑上打包安装,运行的时候总是出现NoClassDefFoundError但是用朋友的电脑运行则是正常的,一开始就纳闷,同样的代码,怎么会这样呢?一开始我将问题定位在环境配置上面,并且将sdk和android studio都换了一遍,结果发现还是一样会出现这个问题.在网上也找了很多种方法,结果都没能解决。有人说是子模块混淆的原因,有人说是java版本不兼容,不过都没有解决我遇到的问题。皇天不负有心人,经过一段时间的捣鼓,最后在stackoverflow上找到了解决方法,现在我将可能出现问题的原因总结一下,希望对大家以后遇到此类问题有帮助。

1、依赖包没有正确引入
解决方法:在build.gradle配置好依赖包,删除build文件夹,clean 项目。
2、java版本不兼容。下面为引用的网上一哥们的分析及解答方法。

我之前的错误就是这个原因导致的,我在AndroidStudio上导出jar包,然后在Eclipse开发环境中使用就会出现上面的两种异常,百思不得其解,最后偶然发现在把工程第一次导入到Eclipse中的时候会报这样的错误

Dx bad class file magic (cafebabe) or version (0033.0000)

Google 百度一番之后发现是Java版本不兼容所致,在AndroidStudio上默认使用的Java版本是1.7. 但是在 Eclipse 的开发环境中默认的Java版本是1.6这样把1.7版本编译的jar包放到Eclipse开发环境中,ADT(ADT最新版本23已经停止更新并且都不支持java1.7)所带的DX工具不支持java1.7所以无法正确的把 jar 文件转换成 dex 文件,这样在最终输出apk的时候就不能把使用java1.7编译的jar包放到apk中。

如果查看AndroidStudio工程的 "xxx.iml" 文件就会发现

 <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">

默认都是这么配置的,所以为了兼容需要在工程的build.gradle中添加

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_6
        targetCompatibility = JavaVersion.VERSION_1_6
    }

有时候在使用 Android 的supportv4 包的时候也会报类似的错误,原因是一样的,检查v4包是使用 java1.6 还是 java1.7编译的。当前工程使用的java版本是不是大于v4使用的java版本。

原文链接:http://www.jianshu.com/p/f789fe4bcacd
3、依赖模块代码混淆出错。这时候如果在Debug,代码都是没有混淆的一切运行正常,但是在Release模式一下,子工程的一些类和方法名会被混淆掉,那么在其他工程中如果引用到了这个类,它引用的还是这个类混淆前的名字,就会报错。所以在配置子工程的混淆设置时一定要确保暴露给外部的API不要被混淆。
解决办法是,将依赖包的某些需要给外界调用的类名,方法名解除依赖。
4、没有完全实现MultiDex support,所以一些类的dex文件找不到。
解决办法:我们不仅要在gradle中的defaultConfig模块中配置multiDexEnabled = true,还要添加com.android.support:multidex:1.0.1依赖,然后让Application继承MultiDexApplication,并且在 attachBaseContext()中调用MultiDex.install()。
我的问题属于最后一种,最后完美解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值