MultiDex
解决方法数越界
资料
Android 开发艺术探索 - 任玉刚
配置
- 在模组的gradle中配置
android {
defaultConfig {
// enable multidex support
multiDexEnabled true
}
}
- Android 5.0 以下需要导包
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
用法
- 在自定义Application中初始化,继续加载其他的 dex
- Application的成员变量和代码块初始化在
attachBaseContext
方法之前,故不能访问未在主dex中打包的类
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
- 或者,直接使用
MultiDexApplication
- 或者,继承使用
MultiDexApplication
自定义Dex
- multidex的9个类必须打包到主dex,否则无法继续加载其他dex
- maindexlist.txt格式,通过脚本或手动生成
com/test/multidextest/TestApplication.class
com/test/multidextest/MainActivity.class
// multidex
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/MultiDexExtractor.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDex$V4.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/ZipUtil.class
android/support/multidex/ZipUtil$CentralDirectory.class
- 自定义maindexlist.txt指定主dex中包含的类
afterEvaluate {
println "afterEvaluate"
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
def listFile = project.rootDir.absolutePath + '/app/maindexlist.txt'
println "root dir:" + project.rootDir.absolutePath
println "dex task found: " + dx.name
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--multi-dex' // 越界时产生分dex
dx.additionalParameters += '--main-dex-list=' + listFile // 主dex中打包的类列表
dx.additionalParameters += '--minimal-main-dex' // 只有指定的类才打包到主dex
}
}