MultiDex
解決方法數(shù)越界
資料
Android 開(kāi)發(fā)藝術(shù)探索 - 任玉剛
配置
- 在模組的gradle中配置
android {
defaultConfig {
// enable multidex support
multiDexEnabled true
}
}
- Android 5.0 以下需要導(dǎo)包
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
用法
- 在自定義Application中初始化,繼續(xù)加載其他的 dex
- Application的成員變量和代碼塊初始化在
attachBaseContext
方法之前逼泣,故不能訪問(wèn)未在主dex中打包的類
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
- 或者,直接使用
MultiDexApplication
- 或者,繼承使用
MultiDexApplication
自定義Dex
- multidex的9個(gè)類必須打包到主dex片排,否則無(wú)法繼續(xù)加載其他dex
- maindexlist.txt格式辫封,通過(guò)腳本或手動(dòng)生成
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' // 越界時(shí)產(chǎn)生分dex
dx.additionalParameters += '--main-dex-list=' + listFile // 主dex中打包的類列表
dx.additionalParameters += '--minimal-main-dex' // 只有指定的類才打包到主dex
}
}