,,Android分包MultiDex策略详解

,,Android分包MultiDex策略详解

本文主要介绍Android转包MultiDex策略的详细讲解,有一定的参考价值,有需要的朋友可以了解一下。

1.分包背景

首先我们来介绍一下MultiDex的背景。

安卓系统在安装应用的时候,有一步就是优化Dex。有一个叫做DexOpt的特殊工具来处理这个过程。第一次加载Dex文件时执行opt的执行过程。这个过程将生成一个ODEX文件,即优化的索引。执行ODex的效率远高于直接执行Dex文件。

然而,在早期的Android系统中,DexOpt出现了一个问题。DexOpt将检索每个类的方法id,并将其存储在一个链表结构中。但是,这个链表的长度由一个短类型保存,这导致方法id的数量不能超过65,536。当一个项目足够大的时候,显然方法数量的上限是不够的。虽然DexOpt在新版Android系统中修复了这个问题,但是我们还是需要兼容更低版本的Android系统。

为了解决方法数量超出限制的问题,需要将dex文件拆分成两个或更多。为此Google正式推出了multidex兼容包,并与AndroidStudio合作实现了一个APK包含多个dex的功能。

在Android的开发中,我们会不断地在App代码中加入新的功能,引入新的类库。如果我们不控制它,我们将在编辑器IDE中遇到一个错误:

错误:任务执行失败:TTT:transformClassesWithDexForDebug。

com . Android . build . API . transform . transform exception:com . Android . ide . common . process . process exception:Java . util . concurrent . execution exception:com . andro id . dex . dexindexoverflowexception:方法ID不在[0,0xffff]中:65536

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

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

2. 分包策略实现

梯度配置:

defaultConfig {

应用程序Id 'XXX '

minSdkVersion 14

目标版本23

多重可解真

}

.

依赖关系{

编译“com . Android . support:multi dex:1 . 0 . 0”

}

在应用的应用程序类中重写方法:

@覆盖

受保护的void attachBaseContext(Context base){

super . attachbasecontext(base);

multi dex . install(this);

}

3.分包效果说明

经过上面的配置,你的应用已经可以实现多个DEX文件了。当应用构建时,构建工具将分析哪些类必须放在第一个DEX文件中,哪些类可以放在其他DEX文件中。当它创建第一个dex文件时,如果需要,它会继续创建额外的dex文件,如classes2.dex,classes3.dex Multi-DEX的支持类库将包含在应用程序的第一个DEX文件中,帮助访问其他DEX文件。

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

将DEX文件安装到设备上的过程非常复杂。如果第二个DEX文件太大,可能会导致应用程序没有响应。这时应该使用ProGuard来减小DEX文件的大小。

由于Dalvik linearAlloc的Bug,应用在Android 4.0之前可能无法启动。如果您的应用程序要支持这些版本,您应该执行更多的测试。

由于Dalvik linearAlloc同样的限制,如果请求大量内存,可能会导致崩溃。Dalvik linearAlloc是一个固定大小的缓冲区。在应用程序的安装过程中,系统将运行一个名为dexopt的程序,为应用程序在当前模型中的运行做准备。Opt使用LinearAlloc来存储应用程序方法信息。Android 2.2和2.3的缓冲区只有5MB,Android 4.x增加到8MB或16MB。当方法数量超过缓冲区时,dexopt将崩溃。

-- multi DEX构建工具尚不支持指定哪些类必须包含在第一个dex文件中,因此某些类库(例如,类库需要从本机代码访问Java代码)可能不可用。

4.对开发者的建议

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

尽量使用专为移动应用设计的Lite/Android版本类库,或者用小型类库代替大型类库,比如用Google-gson代替Jackson JSON。对于Google协议缓冲区等数据交换格式,其标准实现会自动生成大量方法。方丝的实现可以很好的解决这个问题。

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

总结

关于本文中Android转包MultiDex策略的详细解释就这些了。希望对大家有帮助。感兴趣的朋友可以继续参考本站的其他相关内容。如有不足之处,欢迎留言指出。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • windowsandroid手机版下载,windowsandroid安装apk
  • windowsandroid手机版下载,windowsandroid安装apk,WindowsAndroid 安装教程详解
  • android调用webview方法,androidwebview是什么,Android 中 WebView 的基本用法详解
  • android传感器高级编程,Android传感器,Android编程之光线传感器用法详解
  • android.app.Dialog,android自定义dialog对话框,Android开发笔记之-Dialog的使用详解
  • android 图片视频轮播框架,androidlayout轮播图,Android实现炫酷轮播图效果
  • android里的viewpager,安卓自定义view流程,Android自定义引导玩转ViewPager的方法详解
  • android里的viewpager,android viewpager详解
  • android里的viewpager,android viewpager详解,Android自定义超级炫酷的ViewPage指示器
  • android调用webview方法,androidwebview是什么
  • android设置控件宽度,android获取屏幕宽度和高度
  • android设置控件宽度,android获取屏幕宽度和高度,Android中获取控件宽高的4种方法集合
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程,android蓝牙简单开发示例教程
  • android菜单栏,android菜单控件
  • 留言与评论(共有 条评论)
       
    验证码: