### 64K方法数限制原理与解决方案
64K方法数问题也有人称之为65K方法数问题,本质上都是指Android Dalvik可执行文件.dex中的Java方法数引用超过65536,64K的计算方法是65536除以1024,65K的计算方法是65536除以1000,Android 64K的一次幂。
64K方法数问题的直观表现是在构建APP的时候出现编译错误,导致构建失败,提示too many field references
#### 64K限制的原因
Android Apk 文件本质上是个压缩文件,它里面包含的class.dex文件是可执行的Dalvik字节码文件,这个.dex文件中存放的是所有编译后的Java代码。Dalvil可执行文件规范限制了(事实上是最初设计上的一个失误)单个.dex文件最多能引用的方法数是65536个,这其中包含了Android Framework、APP引用的第三方函数库以及APP自身的方法。
android 5.0 (API level 21)之前,系统使用的是Dalvik虚拟机来执行Android应用,默认情况下,Dalvik为每个APK只生成一个classes.dex文件,为了避免单个.dex文件方法数超过64K的问题,我们需要拆分这个单一的classes.dex文件,拆分后可能存在类似于classes.dex、classes2.dex等多个.dex文件。在应用启动后,会先加载classes.dex文件,我们称之为主(Primary)dex文件,应用启动后才会依次加载其他.dex文件,这些统称为从(Secondary)dex文件。为了规避这个64K限制,Google推出了一个名为MultiDex Support Library的函数库,当我们下载了Android Support Libraries之后,可以在<sdk>/extras/android/support/multidex/目录中找到这个函数库
### Android 5.0 之后的版本
从API21及之后的版本Android使用名为ART的虚拟机来代替Dalvik虚拟机,ART天然支持从APK文件中加载多个.dex文件,在应用安装期间,他会执行一个预编译操作,扫描APK中的classes(..N).dex文件并将它们编译成一个单一的.oat文件,在应用运行时去加载这个.oat文件,而不是一个个的加载.dex文件。
### 避免出现64K限制
当app开始触碰到64K方法数的天花板时,不建议立即视同MultiDex Support Library来将apk中的单一.dex拆分成多个,从而规避64K方法数限制引起的编译错误问题。最佳实践是永远保持应用的方法数低于64K,永远没有机会使用MultiDex Support Library,因为使用MultiDex是下下策,在大多数情况下会降低应用的性能,减少应用方法数的方法:
* 检查应用的直接和简洁第三方依赖
* 使用Proguard移除无用的代码:配置并在Release版本中使用ProGuard,它通过分析字节码压缩功能,能够检测并移除没有使用到的类、字段、方法和属性
如果使用以上方法没法将方法数限制在64K以下,那么就需要使用MultiDex,需要在应用module的build.gradle文件的defaultConfig中添加multiDexEnabled true,接着引入MultiDexApplication 初始化MultiDex。
#### MultiDex局限性
MultiDex Support Library是一个不得已而为之的方案,它本身不是完美的,将它集成到项目中,需要经过完整的测试才能上线,可能会出现应用性能下降等问题,具体局限性如下:
* 应用首次启动时Dalvik虚拟机会对所有的.dex文件执行dexopt操作,生成ODEX文件,这个过程很复杂且非常耗时,如果应用的从dex文件太大,可能会导致出现ANR。
* 在Android 4.0(API level 14)之前的系统上,由于Dalvik linearAlloc的bug,使用MultiDex的应用可能启动失败。
* 引入MultiDex机制时,必然会存在主dex文件和从dex文件,应用启动所需要的类都必须放到主dex文件中,否则会出现NoClassDefFoundError的错误。

64K方法数限制原理与解决方案总结相关推荐

  1. 简述Android 解决65536/64K方法数限制方案

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

  2. 【工具】统计jar包和apk中的java方法数

    2019独角兽企业重金招聘Python工程师标准>>> [工具]统计jar包和apk中的java方法数 :http://www.baidufe.com/item/5891ec6f73 ...

  3. 方法超出 android,Android工程方法数超过64k,The number of method references in a .dex file cannot exceed 64K....

    最近将一个老的Eclipse项目转到Android Studio后,用gradle添加了几个依赖,项目可以make,但是一旦run就报错 Error:The number of method refe ...

  4. 安卓应用方法数超过64k解决办法:分割Dex

    你的安卓项目功能很强大,对接了好多第三方开源库,项目越做越完善,代码越敲越爽.可是突然有一天报异常了. 错误:The number of method references in a .dex fil ...

  5. 方法数超了65535 无法安装的解决方案

    错误:Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536 作为一名 ...

  6. AndroidX 方法数限制 Error:Cannot fit requested classes in a single dex file 64K问题

    我使用的最新的AndroidX库报错了,方法数超过65536, 在AndroidX库中的MultiDex解决办法非常简单,只需要一步就可以解决. 在app的gradle里面的defaultConfig ...

  7. Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚

    时之沙: http://blog.csdn.net/t12x3456 随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多 ...

  8. 【Android 安全】DEX 加密 ( 多 DEX 加载 | 65535 方法数限制和 MultiDex 配置 | PathClassLoader 类加载源码分析 | DexPathList )

    文章目录 一.65535 方法数限制和 MultiDex 配置 二.多 DEX 加载引入 三.PathClassLoader 类加载源码分析 四.BaseDexClassLoader 类加载源码分析 ...

  9. 由Android 65K方法数限制引发的思考

    前言 没想到,65536真的很小. 1 Unable to execute dex: method ID not in [0, 0xffff]: 65536 PS:本文只是纯探索一下这个65K的来源, ...

  10. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

最新文章

  1. java书籍_Java程序员必看的 13 本 Java 书籍!
  2. java仿真软件_一个简单的Java仿真程序
  3. 从JAVA转学习Go——Go在eclipse的环境搭建
  4. 二叉树常用方法(一)
  5. C# SFTP上传文件
  6. 认识Windows Communication Foundation
  7. python监控windows日志_Python 监控日志的简单示例
  8. JAVA如何调用对方http接口得到返回数据
  9. [当当网,你意欲何为]之二:无奈,配送之痛
  10. 论文笔记--跨媒体语义共享子空间学习理论与方法研究-2015
  11. Python学习之路9☞面向对象的程序设计
  12. [转]如何有效地记忆与学习
  13. 数据库之互联网常用架构方案一览
  14. Atitit 医学之道 attilax总结
  15. 在计算机网络中软件资源共享是指,在计算机网络中,软件资源共享指的是什么...
  16. compute和compute by
  17. C++11特性及其它常用特性
  18. ATTCK红队评估实战靶场(二)
  19. HSV(HSB)和HSL颜色空间
  20. 基于RFID定位技术的工地人员定位考勤系统-工地人员定位-新导智能

热门文章

  1. unity隐藏鼠标光标的2种方法
  2. Raspberry PI 常用命令
  3. CTF easycap Banmabanma
  4. JAVA 实现 名单按姓氏笔画为序排列
  5. [转载]一位也许是真正的hack说的话
  6. Python监控股价并通过微信提醒
  7. linux系统属于操作系统吗,linux属于什么操作系统
  8. word中mathtype的公式后面的光标位置
  9. 130 个相见恨晚的超实用网站
  10. ❤️【独家】挑战全网最通俗易懂的神经网络的表达能力解释