问题1:65536 ,So easy!
原因:Dalvik 的 invoke-kind 指令集中,method reference index 只留了 16 bits,最多能引用 65535 个方法。
参考=>由 Android 65K 方法数限制引发的思考.
解决:
dependencies {
compile 'com.android.support:MultiDex:1.0.1'
}
继承 Application ,重写 attachBaseContext(Context)
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
问题2:Too many classes in –main-dex-list ,what?
原因:通过上面的官方分包,已经把原 Dex 分为 1 主 Dex 加多从 Dex。主 Dex 包含所有 4 大组件,Application,Annotation,multidex 等及其必要的直接依赖。由于我们方法数已达到 16W 之巨,上百个 Activity 全部塞进主 Dex,又成功的把主 Dex 撑爆了。
解决: gradle
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each { dx ->
if (dx.additionalParameters == null) {
dx.additionalParameters = []
}
dx.additionalParameters += '--set-max-idx-number=48000'
}
}
参考=>Android Dex 分包之旅
问题3:gradle 1.5.0 之后不支持这种写法 ,what the fuck?
原因:官方解释 Gralde1.5.0
以上已经将(jacoco, progard, multi-dex)统一移到Transform API里,然而 Transform API 并没有想象的那么简单好用,翻遍 Google 终于找到一个兼容 Gradle 1.5.0
以上的分包插件