当每个dex包超过65535个方法的时候,程序在运行时会报:NoClassDefFoundError
1 在build.grade中配置defaultConfig:
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
2 在build.grade中配置dependencies:
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
3 使用MultiDexApplication取代Application:
① 如果没有自定义Application,那么在AndroidManifest.xml中指定MultiDexApplication即可。
② 如果有自定义的MyApplaction extends Application,那么改成MyApplaction extends MultiDexApplication。
③ 如果有自定义的MyApplaction继承了一个不能修改的XApplication,那么覆盖attachBaseContext()方法,在其中调用一下MultiDex.install(this)也可以。
4 实现主要的页面编译在主 classes.dex 中,其它的页面编译到 classes1.dex中。
android studio 留了个坑,在 build.gradle 中提供了下面这种方式在项目的app目录下放入 multidex-keep.txt 文件,文件内容是保留在 maindex 的类名列表。
// 格式如下:
com/edo/sample/mutildex_demo/MyApplication.class
com/edo/sample/mutildex_demo/MainActivity.class
defaultConfig {
...
// multidex-keep.txt
multiDexKeepFile file('multidex-keep.txt')
}
然而现实是这种方式并无卵用,实现不了我们的需求,(不太确定是否还有其它配置)。
大家都知道,将 class 打包成 classes.dex 使用的是 build-tools 下的 dx.bat 命令,所以可以从这里下手。
Note: 要在 cmd 中直接使用 dx 命令需要将其加入环境变量。
// 需要将下面的路径加入到环境变量中。
ANDROID_SDK\build-tools\25.0.2\
dx --dex [--debug] [--verbose] [--positions=