|
1 |
| -# Android-Easy-MultiDex |
2 |
| -Android傻瓜式分包插件 |
| 1 | +#Android傻瓜式分包插件 |
| 2 | +注1:不想看前半部分的话可以直接跳过到最下面配置部分。 |
| 3 | +注2:本插件是基于[DexKnifePlugin 1.5.2](https://github.com/ceabie/DexKnifePlugin)优化改造而来,感谢ceabie的无私奉献。 |
| 4 | + |
| 5 | +##填坑之路 |
| 6 | +`坑1:65536 ,So easy! ` |
| 7 | +*原因:*Dalvik 的 invoke-kind 指令集中,method reference index 只留了 16 bits,最多能引用 65535 个方法。 |
| 8 | +参考=>[由Android 65K方法数限制引发的思考](http://jayfeng.com/2016/03/10/%E7%94%B1Android-65K%E6%96%B9%E6%B3%95%E6%95%B0%E9%99%90%E5%88%B6%E5%BC%95%E5%8F%91%E7%9A%84%E6%80%9D%E8%80%83/). |
| 9 | +*解决:* |
| 10 | +``` |
| 11 | +dependencies { |
| 12 | + compile 'com.android.support:MultiDex:1.0.1' |
| 13 | +} |
| 14 | +``` |
| 15 | +继承 Application ,重写 attachBaseContext(Context) |
| 16 | +``` |
| 17 | +@Override |
| 18 | +protected void attachBaseContext(Context base) { |
| 19 | + super.attachBaseContext(base); |
| 20 | + MultiDex.install(this); |
| 21 | +} |
| 22 | +``` |
| 23 | + |
| 24 | +`坑2:Too many classes in –main-dex-list ,what?` |
| 25 | +*原因:*通过上面的官方分包,已经把原Dex分为1主Dex加多从Dex,主Dex保留4大组件,Application,Annotation,multidex等及其必要的直接依赖。由于我们方法数已达到16W之巨,上百个Activity,所以成功的把主Dex又撑爆了。 |
| 26 | +*解决:* |
| 27 | +gradle |
| 28 | +``` |
| 29 | +afterEvaluate { |
| 30 | + tasks.matching { |
| 31 | + it.name.startsWith('dex') |
| 32 | + }.each { dx -> |
| 33 | + if (dx.additionalParameters == null) { |
| 34 | + dx.additionalParameters = [] |
| 35 | + } |
| 36 | + dx.additionalParameters += '--set-max-idx-number=48000' |
| 37 | + } |
| 38 | +} |
| 39 | +``` |
| 40 | +参考=>[Android Dex分包之旅](http://yydcdut.com/2016/03/20/split-dex/index.html) |
| 41 | + |
| 42 | +`坑3:gradle 1.5.0之后不支持这种写法 ,what the fuck?` |
| 43 | +*原因:*官方解释Gralde`1.5.0`以上已经将(jacoco, progard, multi-dex)统一移到[Transform API](http://tools.android.com/tech-docs/new-build-system/transform-api)里,然而Transform API并没有想象的那么简单好用,最后翻遍Google终于找到一个兼容Gradle `1.5.0`以上的分包插件[DexKnifePlugin](https://github.com/ceabie/DexKnifePlugin)。 |
| 44 | +参考=>这篇[Android 热修复使用Gradle Plugin1.5改造Nuwa插件](http://blog.csdn.net/sbsujjbcy/article/details/50839263)比较好的介绍了Transform API的使用。 |
| 45 | + |
| 46 | +`坑4:NoClassDefFoundError ,are you kiding me?` |
| 47 | +*原因:*通过插件手动指定main dex中要保留的类,虽然分包成功,但是main dex中的类及其直接引用类很难通过手动的方式指定。 |
| 48 | +*解决方式:* |
| 49 | +看了[美团Android DEX自动拆包及动态加载简介](http://tech.meituan.com/mt-android-auto-split-dex.html),他们是通过编写了一个能够自动分析Class依赖的脚本去算出主Dex需要包含的所有必要依赖。看来依赖脚本是跑不掉了。 |
| 50 | + |
| 51 | +`坑5:自定义脚本 ,read the fuck source!` |
| 52 | +插件的工作流程: |
| 53 | + |
| 54 | + |
| 55 | + |
| 56 | +##配置部分 |
| 57 | +`第一步:` |
0 commit comments