这篇文章上次修改于 2422 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
这个问题是一个大类,我只说我遇到的情况
首先,遇到这个问题,可以先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.dex
和classes3.dex
等)。然后,构建系统会将所有 DEX 文件打包到您的 APK 中。运行时,Dalvik 可执行文件分包 API 使用特殊的类加载器来搜索适用于您的方法的所有 DEX 文件(而不是仅在主 classes.dex 文件中搜索)。
没有评论