标签:build provider guard 解决问题 led 哪些 reference form http
随着5.0的推出,Android也放出了Multidex Support Library来解决问题。
分包之后就存在一个主的classes.dex,多个副的classes2.dex,classes3.dex…
1 |
collect{variant}MultiDexComponents task |
这个task会读取项目的AndroidManifest.xml文件里注冊的application、Activity、service、receiver、provider、instrumentation相关类,并将其class文件路径写到文件buidl/intermediates/multi-dex/${variant.dirName}/manifest_keep.txt
中
1 |
shrink{variant}MultiDexComponents task |
这个task会调用ProGuard并依据上一步生成的manifest_keep.txt文件内容去压缩class,剔除没实用到的class。生成一个精简的jar包buidl/intermediates/multi-dex/${variant.dirName}/componentClasses.jar
1 |
create{variant}MainDexClassList task |
这个task会依据上一步生成的componentClasses.jar去寻找这里面的各个class文字中依赖的class,比方一个class中有一成员变量X。那么X就是依赖的class,componentClasses.jar中全部的class和依赖的class路径都会被写入到文件buidl/intermediates/multi-dex/${variant.dirName}/maindexlist.txt
中,这个文件里的类都会被编译进主的classes.dex中去。(详情能够查看ClassReferenceListBuilder的实现源代码)
Multidex固然是好的,不用再为方法数超过65536而苦恼了。
可是有时往往会带来意想不到的bug。比方NoClassDefFoundError。之前我就在项目中遇到了这个问题。一启动程序就crash了,看log是因为某个类找不到引起的。
create{variant}MainDexClassList
这个task完毕之后再去改动maindexlist.txt文件加入丢失的class。 Android 65K问题之Multidex原理分析及NoClassDefFoundError的解决方法
标签:build provider guard 解决问题 led 哪些 reference form http
原文地址:http://www.cnblogs.com/yutingliuyl/p/7117756.html