安卓开发中解决65535的限制

65535代码的含义html

    随着应用不断迭代和业务线的扩展,应用愈来愈大(好比集成了各类第三方sdk或者公共支持的jar包,项目耦合性高,重复做用的类愈来愈多),应用中的Dex 文件方法数超过了最大值65536的上限,简单来讲,应用爆棚了。java

65535错误出现缘由android

    在Android系统中,一个App的全部代码都在一个Dex文件里面。Dex是一个相似Jar的存储了多有Java编译字节码的归档文件。由于Android系统使用Dalvik虚拟机,因此须要把使用Java Compiler编译以后的class文件转换成Dalvik可以执行的class文件。这里须要强调的是,Dex和Jar同样是一个归档文件,里面仍然是Java代码对应的字节码文件。框架

当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高不少。可是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每个类的方法id检索起来,存在一个链表结构里面。可是这个链表的长度是用一个short类型来保存的,致使了方法id的数目不可以超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,可是咱们仍然须要对低版本的Android系统作兼容。ide

经常使用的解决方法工具

  • 应用插件化(插件化框架)
  • 分割Dex,多工程: 把所须要的.class文件或者是Jar文件和一些源码一块儿编译生成一个Jar文件。而后使用Android SDK提供的dx工具把Jar文件转成Dex文件。咱们能够提早对它进行ODex操做,让它在被DexClassLoader加载的时候,跳过DexOpt的部分工做,从而加快加载的过程。
  • 固然,Google看来也意识到了目前应用方法数爆棚的问题, 目前在已经在API 21中提供了通用的解决方案,那就是android-support-multidex.jar。这个jar包最低能够支持到API 4的版本(Android L及以上版本会默认支持mutidex)。

虽然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开发者来讲尤其重要。spa

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

 

相关资料

1.MutiDex文档 https://developer.android.com/reference/android/support/multidex/MultiDex.html

2. http://blog.osom.info/2014/10/multi-dex-to-rescue-from-infamous-65536.html

3.附android -support-mutidex.jar下载地址: http://download.csdn.net/detail/t12x3456/8143383

相关文章
相关标签/搜索