1.使用的话,首先添加依赖库:
//分包multiDexEnabled必须添加该依赖
compile 'com.android.support:multidex:1.0.1'
2.另外开启Multidex开关:
buildTypes {
release {
minifyEnabled false
//分包
multiDexEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
3.这时候运行的话可能会报java堆内存错误,因此最好添加上:
dexOptions {
javaMaxHeapSize "4g"
incremental true
}
4.如果你有自己的Application,则修改一下Application使其继承MultiDexApplication
public class MyApplication extends MultiDexApplication {
...
}
如果你的Application很不幸已经继承了其他Application导致无法继承MultiDexApplication的话,那也是可以是,只需要复写该方法并加上该代码:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
collect{variant}MultiDexComponents task
这个task会读取项目的AndroidManifest.xml文件中注册的application、Activity、service、receiver、provider、instrumentation相关类,并将其class文件路径写到文件buidl/intermediates/multi-dex/${variant.dirName}/manifest_keep.txt
中
shrink{variant}MultiDexComponents task
这个task会调用ProGuard并根据上一步生成的manifest_keep.txt文件内容去压缩class,剔除没有用到的class,生成一个精简的jar包
buidl/intermediates/multi-dex/${variant.dirName}/componentClasses.jar
create{variant}MainDexClassList task
这个task会根据上一步生成的componentClasses.jar去寻找这里面的各个class文字中依赖的class,比如一个class中有一成员变量X,那么X就是依赖的class,componentClasses.jar中所有的class和依赖的class路径都会被写入到文件buidl/intermediates/multi-dex/${variant.dirName}/maindexlist.txt
中,这个文件中的类都会被编译进主的classes.dex中去。(详情可以查看ClassReferenceListBuilder的实现源码)
NoClassDefFoundError
Multidex固然是好的,不用再为方法数超过65536而苦恼了。但是有时往往会带来意想不到的bug,比如NoClassDefFoundError。之前我就在项目中遇到了这个问题,一启动程序就crash了,看log是由于某个类找不到引起的。
create{variant}MainDexClassList
这个task完成之后再去修改maindexlist.txt文件添加丢失的class。
转自:http://blog.csdn.net/hjhrq1991/article/details/51008734