这篇文章上次修改于 2353 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

这个问题是一个大类,我只说我遇到的情况

首先,遇到这个问题,可以先Clean Project,如果没用,请继续往下看

这里有一份详细的分析文档,但并不适应于我遇到这种情况,因为这是在Android上才能遇到的情况

问题就出在分包上,什么是分包?

当方法数超过65535时,就会需要分包,代码打包成多个DEX文件。

为什么是65535?

Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及您自己代码中的方法。在计算机科学领域内,术语千(简称 K)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此这一限制也称为“64K 引用限制”。

代码量不够还真遇不到这个错误[苦笑]

首先会报这样一个错误

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Return code 2 for dex process

提示信息

The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html

配置 multiDexEnabled 开启分包

defaultConfig {
    applicationId "com.deanlib.application"
    minSdkVersion 15
    targetSdkVersion 25
    multiDexEnabled = true//开启分包
    versionCode 16
    versionName "1.0_beta16"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

开启分包后,运行工程就有可能遇这个 java.lang.NoClassDefFoundError问题,当然也有可能遇不到,这个很好理解,当第一个DEX包中运行的代码调用到其他包中的类或者方法时,才会报这个错误,而且还有一点,就是在Andrid 5.0以下才能遇到这个问题,因为Android 5.0以上使用了ART机制 ,支持从 APK 文件加载多个 DEX 文件运行。

解决方法:使用 MultiDexApplication 替换 Application

Android 构建工具会根据需要构建主 DEX 文件 (classes.dex) 和辅助 DEX 文件(classes2.dexclasses3.dex 等)。然后,构建系统会将所有 DEX 文件打包到您的 APK 中。

运行时,Dalvik 可执行文件分包 API 使用特殊的类加载器来搜索适用于您的方法的所有 DEX 文件(而不是仅在主 classes.dex 文件中搜索)。

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