位置: 编程技术 - 正文

Android分包MultiDex策略详解(安卓 分包解压)

编辑:rootadmin

推荐整理分享Android分包MultiDex策略详解(安卓 分包解压),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:app分包,android 分包,安卓 分包解压,安卓 分包解压,安卓分发包安装器,Android分包和文件结构,Android分包策略,android 分包,内容如对您有帮助,希望把文章链接给更多的朋友!

1.分包背景

这里首先介绍下MultiDex的产生背景。

当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。

但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的Android系统做兼容。

为了解决方法数超限的问题,需要将该dex文件拆成两个或多个,为此谷歌官方推出了multidex兼容包,配合AndroidStudio实现了一个APK包含多个dex的功能。

我们在Android开发中,会不断的在App代码里面增加新功能,引入新的类库,如果不加控制的话,那么会碰到编辑器IDE爆出一下错误:

这个错误是Android应用的对方法总数有限制造成的。Android平台的Java虚拟机Dalvik在执行DEX格式的Java应用程序时,使用原生类型short来索引DEX文件中的方法。这意味着单个DEX文件可被引用的方法总数被限制为。通常APK包含一个classes.dex文件,因此Android应用的方法总数不能超过这个数量,这包括Android框架、类库和你自己开发的代码。

这个问题可以通过将一个DEX文件分拆成多个DEX文件解决。

2. 分包策略实现

Android分包MultiDex策略详解(安卓 分包解压)

Gradle 配置:

在应用的Application 类重写方法:

3.分包效果说明

经过以上的配置,你的应用已经可以实现多个DEX文件了。当应用构建时,构建工具会分析哪些类必须放在第一个DEX文件,哪些类可以放在附加的DEX文件中。当它创建了第一个DEX文件后,如果有必要会继续创建附加的DEX文件,如classes2.dex, classes3.dex。Multidex的支持类库将被包含在应用的第一个DEX文件中,帮助实现对其它DEX文件的访问。

虽然Google解决了应用总方法数限制的问题,但并不意味着开发者可以任意扩大项目规模。Multidex仍有一些限制:

DEX文件安装到设备的过程非常复杂,如果第二个DEX文件太大,可能导致应用无响应。此时应该使用ProGuard减小DEX文件的大小。

由于Dalvik linearAlloc的Bug,应用可能无法在Android 4.0之前的版本启动,如果你的应用要支持这些版本就要多执行测试。同样因为Dalvik linearAlloc的限制,如果请求大量内存可能导致崩溃。Dalvik linearAlloc是一个固定大小的缓冲区。在应用的安装过程中,系统会运行一个名为dexopt的程序为该应用在当前机型中运行做准备。dexopt使用LinearAlloc来存储应用的方法信息。Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB或MB。当方法数量过多导致超出缓冲区大小时,会造成dexopt崩溃。

-Multidex构建工具还不支持指定哪些类必须包含在首个DEX文件中,因此可能会导致某些类库(例如某个类库需要从原生代码访问Java代码)无法使用。

4.对开发者的建议

开发者应该避免使用Google Guava这样的类库,它包含了多个方法。

尽量使用专为移动应用设计的Lite/Android版本类库,或者使用小类库替换大类库,例如用Google-gson替换Jackson JSON。而对于Google Protocol Buffers这样的数据交换格式,其标准实现会自动生成大量的方法。采用Square Wire的实现则可以很好地解决此问题。

在出现应用分包后低版本手机无法使用,高版本正常使用的问题时,可以考虑检查一下分包的配置是否正确。

总结

标签: 安卓 分包解压

本文链接地址:https://www.jiuchutong.com/biancheng/372123.html 转载请保留说明!

上一篇:Python 判断是否为质数或素数的实例(python中判断)

下一篇:浅谈Python由__dict__和dir()引发的一些思考(python的dict类型)

  • 一般纳税人的进销项税怎么做分录
  • 公司购买二手房可以开增值税专用发票吗
  • 关税减免形式主要包括
  • 房产租赁增值税率是5%还是9%
  • 运输货车折旧计算公式
  • 小规模纳税人需要做进项税吗
  • 成本税率计算公式
  • 境内公司代付境外货款
  • 想要自己开厂应该怎么做
  • 招拍挂方式取得土地,应该取得土地后立项
  • 财务中预付账款是什么意思
  • 货代行业红字冲正发票怎么做凭证
  • 购买毛巾的费用是多少
  • 库存红字冲销
  • 企业购买汽车时需要交哪些税?
  • 企业收取多年租金怎么算
  • 个人申请补交个税怎么写
  • 执行公司股权
  • 一般贸易免抵退税计算
  • 金税盘使用说明
  • 新公司开业的祝福语
  • 企业所得税季报怎么申报
  • 代开票的时候扣了城建税,申报的时候还需要填写吗?
  • 办税人员的职责和义务
  • 资产负债率高说明长期偿债能力强吗
  • 研发企业税率
  • 季度不含税收入30万以内免增值税
  • 商品进价销售要上税吗
  • 工程公司更换单位怎么办
  • php过滤数组中的空字符串
  • 工厂返费能拿到吗
  • Win10 20H2 Beta 预览版 19042.782正式推送(附更新内容)
  • 外购货物用于职工福利进项税额可以抵扣吗
  • 认缴资本 实收资本
  • 印花税税收优惠政策2023
  • win10开始菜单磁贴设置
  • 视同销售成本如何确认?
  • 电脑输入法设置搜狗输入法
  • 固定资产提前报废
  • 交去年企业所得税怎么做资产负债表
  • 建筑施工企业收入怎么确认
  • 企业之间支付的管理费指什么
  • mysql数据库性能监控
  • 什么是企业汇算清缴年度
  • 固定资产大修理和更新改造的区别
  • 公司为职工提供免费午餐需要交纳个人所得税吗?
  • 实业投资收益如何
  • 纳税实务的涉税业务分几类
  • 会计分录如何分配利润
  • 建造生产线计入什么科目
  • 广告公司制作警车违法吗
  • 抵债资产处置账务实例
  • 对公账户分为几类
  • 设计服务成本和信息中心的测试成本
  • 航天信息服务费不交可以吗
  • 房地产开发企业资质管理规定
  • 其他收益和营业外收入有什么区别
  • 跨年做进项税额转出
  • mysql详细介绍
  • sqlserver数据库和mysql区别
  • sqlserver全文检索
  • ubuntu系统如何安装
  • linux链接分为什么和什么
  • linux防火墙设置firewalld
  • win8如何进入启动选择
  • win2008个性化
  • errorlnk2019怎么解决
  • 多媒体播放器使用方法
  • Node.js中的事件循环是什么
  • linux使用adb
  • 服务器总是自动关机
  • 介绍一个简单的实验
  • jQuery EasyUI tree 使用拖拽时遇到的错误小结
  • nodejs cgi
  • 安卓wifi打不开解决
  • adb push、adb install 和强制安装
  • 如何用jquery
  • 青岛地方税务局第三分局局长
  • 成都交房需要交什么费用
  • 地摊经济火了,月薪8000元
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设