当前位置:首页 > 资讯 > info6 > 正文

解决Android 5.0以下出现 java.lang.NoClassDefFoundError,找不到类

发表于: 2017-05-15   作者:cgq1030699125   来源:转载   浏览:
摘要: 本文参考自:http://www.jianshu.com/p/8b4f711da0bb问题的主要原因:方法数超65536限制。由于实际开发当中的需求不断变更,开源框架越来越多,大多都用第三方SDK,导致方法数很容易超出65536限制。出现错误java.lang.NoClassDefFoundError,例如:java.lang.NoClassDefFoundError:uk.co.senab.ph

本文参考自:http://www.jianshu.com/p/8b4f711da0bb

问题的主要原因:方法数超65536限制。

由于实际开发当中的需求不断变更,开源框架越来越多,大多都用第三方SDK,导致方法数很容易超出65536限制。出现错误java.lang.NoClassDefFoundError,

例如:

java.lang.NoClassDefFoundError:uk.co.senab.photoview.PhotoViewAttacher

测试6.0手机没问题,4.4上面就有问题了。导致出现以上错误崩溃。

当我跟进去走debug的时候 ,其实发现这个类并没有什么毛病。

这个错误是Android应用的方法总数限制造成的。Android平台的Java虚拟机Dalvik在执行DEX格式的Java应用程序时,使用原生类型short来索引DEX文件中的方法。这意味着单个DEX文件可被引用的方法总数被限制为65536。通常APK包含一个classes.dex文件,因此Android应用的方法总数不能超过这个数量,这包括Android框架、类库和你自己开发的代码。而Android 5.0和更高版本使用名为ART的运行时,它原生支持从APK文件加载多个DEX文件。在应用安装时,它会执行预编译,扫描classes(..N).dex文件然后将其编译成单个.oat文件用于执行. 通熟的讲,就是分包。

那么Android5.0以下怎么分包.解决超出方法数限制问题

解决方法:

一、配置build.gradle (app)

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId ""
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0.0"
        multiDexEnabled true
    }
dependencies { compile 'com.android.support:multidex:1.0.0' }

二、使用自定义的Application继承MultiDexApplication这个类,或者重写Application的方法attachBaseContext(),并调用MultiDex.install();

@Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }

三、到项目的根目录下执行 ./gradlew clean build

关于使用android-support-multidex解决Dex超出方法数的限制问题,还可以参考:

作者:时之沙
Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚

本文为记录Android开发当中的一些坑.希望能帮到大家

再次感谢作者:泡在简书的日子_Knight
文章链接:http://www.jianshu.com/p/8b4f711da0bb

解决Android 5.0以下出现 java.lang.NoClassDefFoundError,找不到类

编辑推荐
  在Eclipse中,导入Android工程,工程没有报错,运行时,出现 java.lang.NoClassDefFoundError类
文章来源:http://www.dataguru.cn/thread-331456-1-1.html 今天想要将spark-shell 在yarn-client的
解决Junit单元测试 找不到类  做junit 单元测试时,发现怎么执行都是以前编译过得代码。   最后
今天鄙人重装系统,打开Eclipse后,出现以下错误,我检查了一下环境配置,在DOS中测试,一切OK,可
环境 JBoss 6.0 + MyEclipse 8.6 + MySQL 5.1 + Struts 2.3 + EJB 3.0 问题 启动JBoss出现“java.la
环境 JBoss 6.0 + MyEclipse 8.6 + MySQL 5.1 + Struts 2.3 + EJB 3.0 问题 启动JBoss出现“java.la
在Android Studio 上导入第三方类库的方式如下: 0.3.7以下版本: 1.将jar包拷贝到libs目录下; 2.
文件目录结构 运行命令错误情况 解决: 当前目录为/root/hadoop-book-2e/ch05/src/main/java,退到/
Material Design是Google在2014年的I/O大会上推出的全新设计语言。Material Design是基于Android 5.
这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号