随着5.0的推出,Android也放出了Multidex Support Library来解决问题。
compile 'com.android.support:multidex:1.0.1'
release {
minifyEnabled false
//分包
multiDexEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
javaMaxHeapSize "4g"
incremental true
}
...
}
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
分包之后就存在一个主的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的实现源代码)
NoClassDefFoundError
Multidex固然是好的,不用再为方法数超过65536而苦恼了。
可是有时往往会带来意想不到的bug。比方NoClassDefFoundError。之前我就在项目中遇到了这个问题。一启动程序就crash了,看log是因为某个类找不到引起的。
create{variant}MainDexClassList
这个task完毕之后再去改动maindexlist.txt文件加入丢失的class。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架