博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android DexIndexOverflow错误解析和解决方案
阅读量:7051 次
发布时间:2019-06-28

本文共 1883 字,大约阅读时间需要 6 分钟。

1. 错误剖析

  • 前些天进行Android应用开发时遇到一个错误: DexIndexOverflow。后面经过努力解决,这里做个记录,也为其它遇到这个问题的人做个帮助。

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

  • 具体错误如下:

    Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

2. 解决方案

  • 采用Android Developers提供的分片库,解决原理是将一个DEX文件分拆成多个DEX文件。

  • 具体解决方案:

    1. 在gradle文件中引入multidex。

      android {      ......      defaultConfig {          ......          **multiDexEnabled true**      }      ......  }  dependencies {      **compile 'com.android.support:multidex:1.0.1'**  }
    2. 在应用中开启这个方法,这里是在MyApplicaption中启动:

      @Override  protected void attachBaseContext(Context base) {      super.attachBaseContext(base);      **MultiDex.install(this);**  }
  • 经过以上步骤,你的应用已经可以实现多个DEX文件了。当应用构建时,构建工具会分析哪些类必须放在第一个DEX文件,哪些类可以放在附加的DEX文件中。当它创建了第一个DEX文件(classes.dex)后,如果有必要会继续创建附加的DEX文件,如classes2.dex, classes3.dex。

  • Multidex的支持类库将被包含在应用的第一个DEX文件中,帮助实现对其它DEX文件的访问。

3. 总结

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

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

    2. 由于Dalvik linearAlloc的Bug,应用可能无法在Android 4.0之前的版本启动,如果你的应用要支持这些版本就要多执行测试。

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

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

  • 避免应用过大、方法过多仍然是Android开发者要注意的问题。Mihai Parparita的开源项目dex-method-counts可以用于统计APK中每个包的方法数量。

  • 通常开发者自己的代码很难达到这样的方法数量限制,但随着第三方类库的加入,方法数就会迅速膨胀。因此选择合适的类库对Android开发者来说尤为重要。

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

转载地址:http://ujcol.baihongyu.com/

你可能感兴趣的文章
系统集成资质培训 - 考前冲刺100题新书上市
查看>>
一键自动化部署(定制rpm包)
查看>>
web.py开发web 第七章 Formalchemy + Jinja2
查看>>
Python Replace
查看>>
expect自动化交互脚本(三)
查看>>
Oracle 备份与恢复学习笔记(6_3)
查看>>
MySQL分库分表分库后的查询(8th)
查看>>
我的友情链接
查看>>
一张图看清楚成功人士与失败人士的差别,成功人士的10个标志
查看>>
SimpleGame分析
查看>>
Cocos-2d CCLayer的触摸响应CCTouchDelegate和CCStandardTouchDelegate 和 CCTargetedTouchDelegate
查看>>
C#系列视频教程-字符和字符串操作
查看>>
asp.net中使用窗体身份验证
查看>>
别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5)
查看>>
ORA-01172、ORA-01151错误处理
查看>>
pl/sql 找到数组中公有的字符
查看>>
Spring MVC +MyBatis +MySQL 登录查询Demo 解决了mybatis异常【转】
查看>>
Junk Dimension
查看>>
win7下安装mysql-connector遇到的问题
查看>>
OSPF复习1
查看>>