在Android项目开发中,尤其是开发类似淘宝,京东,微信,直播等大型项目中,由于产品的迭代,业务模块的快速增长,到了一定的规模后难免会遇到65536/64K方法数的问题。

它是个什么鬼?

这个问题,网上还有其他人说65方法数问题,本质上都市指Android Dalvik可执行文件.dex中的Java方法数引用超过65536,64K的计算方法是65536/1024,65K的计算方法是65536/1000,Android的官方说法就是64K这种说法。

也就是说64K方法数问题就是在构建APP的时候出现编译,导致构建的失败。同时,在旧版本和新版本的构建系统中提示也会不一样。卧槽,我们不一样。。。。

旧版本错误提示

com.android.dex.DexIndexOverflowException:method IDnotin[0,0xffff]:65536

新版本错误提示

trouble weriting output:Too many field references:131000;max is 65536.You may try using --multi-dex option

64K限制的原因

Android APK 文件本质上是一个压缩的文件,它的里面包含的classes.dex文件是可执行Dalvik文件,这个.dex文件中存放的是所有便宜后的java代码。Dalvik可执行文件规范限制了单个,dex文件最多能够引用的方法数是65536个,这其中包含了Android Framework、APP引用的第三方函数库以及APP自身的方法。

使用MultiDex解决问题

Android5.0版本之前

在Android5.0(API 21)前,系统使用的是Dalvik虚拟机来执行Android 应用,默认情况下,Dalvik为每个APK只生成一个classes.dex文件,为了规避单个.dex文件方法数超过64k的问题,我们需要拆分这个单一的classes.dex文件,拆分后可能存在类似于classes.dex、classes2.dex、classes3.dex等多个.dex文件,具体多小个需要看开发者的配置以及应用的方法总数。在启动应用时,会先加载classes.dex文件,我们叫做主的.dex文件,应用在启动后时才会依次加载其他.dex文件,这些叫做从
的.dex文件。

为了规避这些问题,Google推出了一个名为MultiDex Support Library的函数库,当我们下载了Android Support Libraries之后,可以在SDK/extra/android/support/multidex/目录中找到这个函数库。

Android5.0之后版本

Android5.0 之后开始,Android使用名为ART的虚拟机来代替Dalvik虚拟机,ART天然支持从APK中间中加载多个.dex文件,在应用安装亲戚间,它会执行一个预编译操作,scanAPK中所有classes.dex文件并将他们以便宜成一个单一的.oat文件,在引用运行时去加载这个.oat文件,而不是一个一个的加载.dex文件。

如何避免出现64K限制

1,有效减少方法数,避免使用降低性能的MultiDex Support Library。

如何减少方法数

1,减少使用第三方函数库,尽量避免使用。
2,使用Proguard移除无用代码:配置并在Release版本中使用Proguard,它的压缩功能通过分析字节码,能够检测并且一处没有使用到的类、字段、方法和属性。

如何配置MultiDex

最后实在是没办法了,来吧。配一配解决问题。
Android 的Gradle插件在Android Build Tool21.1 就支持使用MultiDex了。

首先配置APP module的build.gradle文件

defaultConfig {      multiDexEnabled true}
android-support-multidex.jar或者compile 'com.android.support:multidex'

引入MultiDexApplication

如果自身有BaseAppcation就直接继承MultiDexApplication。

如何应用已经有自定义Appcation类,而且你不想或者不能修改它的弗雷,那么也可以通过腹泻attachBaseContext方法并初始化MultiDex。
因为attachBaseContext是在oncreate之前执行的。是应用最早执行的方法。

在此,使用MultiDex Support Library会有一些损耗,必须进行一下优化,请看下编博文之谈。

如果对您有帮助,请点赞,留言,顶了

更多相关文章

  1. Android音频开发(四)——ffmpeg的编译
  2. 浅入浅出 Android(安卓)安全(六)Android(安卓)安全的其它话题
  3. Android(安卓)—— 自定义View的实现方法
  4. Android真机连接Eclipse时,打不开File Explorer下的data文件夹解
  5. Android(安卓)UI事件处理、focus处理
  6. Android程序开发学习笔记系列――基础篇(附源码)
  7. Qt on Android: http下载与Json解析
  8. Android(安卓)NDK开发:打包so库及jar包供他人使用
  9. Android中的单例模式

随机推荐

  1. 在android开发中应该如何管理内存或者是
  2. Android(安卓)笔记 :Android(安卓)热修复
  3. android使用Fragment实现底部菜单使用sho
  4. Android(安卓)双进程守护
  5. 基于Android(安卓)RIL层实现来电拦截的技
  6. Android保活从入门到放弃:乖乖引导用户加
  7. 【移动开发】Android中不用图片资源也能
  8. Android(安卓)ROM分析(1):刷机原理及方法
  9. Apache POI库简化,仅保留hwpf部分(word文
  10. YUV 400 格式图像转换成 ARGB 格式图像中