Skip to content

Commit b1cc659

Browse files
authored
Update README.md
1 parent dc4324f commit b1cc659

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

README.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
#Android傻瓜式分包插件
1+
# Android傻瓜式分包插件
22
注1:不想看前半部分的话可以直接跳过到最下面配置部分。
33
注2:本插件是基于[DexKnifePlugin 1.6.0](https://github.com/ceabie/DexKnifePlugin)优化改造而来,感谢ceabie的无私奉献。
44

5-
##填坑之路
6-
###坑1:65536 ,So easy!
5+
## 填坑之路
6+
### 坑1:65536 ,So easy!
77
**原因:**Dalvik 的 invoke-kind 指令集中,method reference index 只留了 16 bits,最多能引用 65535 个方法。
88
参考=>[由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/).
99

@@ -28,7 +28,7 @@ protected void attachBaseContext(Context base) {
2828
}
2929
```
3030

31-
###坑2:Too many classes in –main-dex-list ,what?
31+
### 坑2:Too many classes in –main-dex-list ,what?
3232
**原因:**通过上面的官方分包,已经把原Dex分为1主Dex加多从Dex。主Dex包含所有4大组件,Application,Annotation,multidex等及其必要的直接依赖。由于我们方法数已达到16W之巨,上百个Activity全部塞进主Dex,又成功的把主Dex撑爆了。
3333

3434
**解决:**
@@ -47,17 +47,17 @@ afterEvaluate {
4747
```
4848
参考=>[Android Dex分包之旅](http://yydcdut.com/2016/03/20/split-dex/index.html)
4949

50-
###坑3:gradle 1.5.0之后不支持这种写法 ,what the fuck?
50+
### 坑3:gradle 1.5.0之后不支持这种写法 ,what the fuck?
5151
**原因:**官方解释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)
5252
扩展=>这篇[Android 热修复使用Gradle Plugin1.5改造Nuwa插件](http://blog.csdn.net/sbsujjbcy/article/details/50839263)比较好的介绍了Transform API的使用。
5353

54-
###坑4:NoClassDefFoundError ,are you kiding me?
54+
### 坑4:NoClassDefFoundError ,are you kiding me?
5555
**原因:**通过插件手动指定main dex中要保留的类,虽然分包成功,但是main dex中的类及其直接引用类很难通过手动的方式指定。
5656

5757
**解决方式:**
5858
[美团Android DEX自动拆包及动态加载简介](http://tech.meituan.com/mt-android-auto-split-dex.html),他们是通过编写了一个能够自动分析Class依赖的脚本去算出主Dex需要包含的所有必要依赖。看来写脚本是跑不掉了。
5959

60-
###坑5:自定义脚本 ,read the fuck source!
60+
### 坑5:自定义脚本 ,read the fuck source!
6161
**问题一:**哪些类是需要放入主Dex中?
6262
查看sdk\build-tools\platform-version\mainDexClasses.rules发现放入主Dex相关类有Instrumentation,Application,Activity,Service,ContentProvider,BroadcastReceiver,BackupAgent的所有子类。
6363

@@ -101,18 +101,18 @@ afterEvaluate {
101101
}
102102
```
103103

104-
###坑6:主dex依然爆表,shit again!
104+
### 坑6:主dex依然爆表,shit again!
105105
其实上面那段脚本已经成功筛选出我们想要放入主Dex的`manifest_keep列表``maindexlist列表`,但是在打包的时候还是把所有类打进主Dex(已无语)。这个时候就需要跟[DexKnifePlugin](https://github.com/ceabie/DexKnifePlugin)插件配合使用,首先在gradle中加上上述脚本,然后使用插件时在配置文件中加上 `-split **.**``#-donot-use-suggest`。DexKnifePlugin插件运行原理很简单,在生成Dex任务之前首先读取自己的配置文件(包含前面我们通过Gradle脚本生成的`maindexlist`列表),然后扫描combined.jar(包含工程中所有.class文件)匹配出我们自定义的maindexlist.txt,再替换掉build/multi-dex/maindexlist.txt,和build实例。这样分包的时候就会基于我们的规则生成主Dex。
106106

107-
###坑7:ANR,HAHAHA!
107+
### 坑7:ANR,HAHAHA!
108108
我们最低API=16,测试并未发现ANR问题,所以暂时没考虑景上添花,这个问题比较好解决。
109109
参考=>[Android Dex分包之旅](http://yydcdut.com/2016/03/20/split-dex/index.html)
110110

111-
###Congratulation
111+
### Congratulation
112112
恭喜,填坑终于结束,不过还有点不爽的是需要同时维护Gradle脚本和插件的配置。
113113
于是乎就将Gradle脚本整合进了插件,这样只需维护一个配置文件就行了。读者可以根据自己需求自行选择分开配置还是整合配置。通过这种方式我们把主Dex的方法数维持在15000左右,从此再也不用担心方法数问题了!!!
114114

115-
##配置部分
115+
## 配置部分
116116
**第一步:添加分包支持**
117117
```
118118
android{
@@ -201,7 +201,7 @@ dexKnife{
201201

202202
**第六步:在 defaultConfig 或者 buildTypes中打开 multiDexEnabled true,否则不起作用**
203203

204-
##已知错误
204+
## 已知错误
205205

206206
注:分包的时候如果发现一些莫名的错误,可以关掉instant run,一般都能解决
207207

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy