Android方法数超出限定的问题(multiDex,jumboMode)
在Android项目开发中,项目代码量过大或通过引入很多jar导致代码量急剧增加,会出现错误:
android.dex.DexIndexOverflowException: Cannot merge new index xxxx into a non-jumbo instruction!
错误出现的原因是 Android设定的方法数是65536个(DEX 64K problem),超过这个方法数,导致dex无法生成,就无法生成APK.
限制原因: 早期的Dalvik VM内部使用short类型变量来标识方法的id,就有了 最大方法数的限制65536。
解决方法:
删除不用的方法,删除不使用的jar。
分包
通过在defaultConfig中设置multiDexEnabled开启分包模式,分包之后的Dex就低于了限制数,保证了正常的打包。
defaultConfig {
multiDexEnabled=true
}
- 忽略方法数限制的检查
android.dexOptions {
jumboMode = true
}
设置dexOptions的,不做方法数限制的检查,这样做的缺点是apk无法再低版本的设备上面安装,会出现错误:
INSTALL_FAILED_DEXOPT
关于dexoptions
和jumboMode
在stackoverflow中有一段描述:
In the standard java world:
When you compile standard java code : the compiler produce
*.class
file. A*.class
file contains standard java bytecode that can be executed on a standard JVM.
In the Android world:
- It is different. You use the java language to write your code, but the compiler don't produce
*.class
files, it produce*.dex
file. A*.dex
file contains bytecode that can be executed on the Android Virtual Machine (dalvik) and this is not a standard Java Virtual Machine.
To be clear: a dex file in android is the equivalent of class in standard java.
Sodexoptions
is a gradle object where some options to configure this java-code-to-android-bytecode transformation are defined. The options configured via this object are :- targetAPILevel
- force-jumbo mode (when enabled it allows a larger number of strings in the dex files)
在标准Java的世界
当编译java代码时,编译器生成.class
文件。.class
文件包含了java的字节码。这些字节码在JVM中执行。
在安卓的世界则不同:
- 用java语音写安卓的代码,但是编译器生成的是
.dex
文件,不是.java
文件。.dex
文件包含了在Android虚拟机中可以执行的字节码,而不是JVM。所以.dex
文件的作用和标准Java中的.class文件差不多。
dexoptions
是一个gradle对象,这个对象用来设置从java代码向.dex文件转化的过程中的一些配置选项。其中一个就是force-jumbo mode。force-jumbo mode允许你创建更大的.dex
文件。
参考资料:
- https://segmentfault.com/a/1190000004187484
- https://stackoverflow.com/questions/24224186/what-is-dex-in-gradle/24224385#24224385
- http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.DexOptions.html
Android方法数超出限定的问题(multiDex,jumboMode)的更多相关文章
- (转载)Android 方法数超过64k、编译OOM、编译过慢解决方案。
Android 方法数超过64k.编译OOM.编译过慢解决方案. 目前将项目中的leancloud的即时通讯改为环信的即时通讯.当引入easeui的时候 出现方法数超过上限的问题. 搜索一下问题, ...
- Android方法数不能超过65535
为什么方法数不能超过65535?搬上Dalvik工程师在SF上的回答,因为在Dalvik指令集里,调用方法的invoke-kind指令中,method reference index只给了16bits ...
- Android 方法数超过64k、编译OOM、编译过慢解决方案。
目前将项目中的leancloud的即时通讯改为环信的即时通讯.当引入easeui的时候 出现方法数超过上限的问题. 搜索一下问题,解决方法很简单. 这里简单记录一下,顺序记录一下此解决方案导致的另一个 ...
- Android方法数methods超过65536
当Android App中的方法数超过65535时,如果往下兼容到低版本设备时,就会报编译错误: Cannot fit requested classes in a single dex file. ...
- 针对android方法数64k的限制,square做出的努力。精简protobuf
1.早期的Dalvik VM内部使用short类型变量来标识方法的id,dex限制了程序的最大方法数是65535,如果超过最大限制,无法编译,把dex.force.jumbo=true添加到proje ...
- 彻底解决Android 应用方法数不能超过65K的问题
作为一名Android开发者,相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik forma ...
- android MultiDex multidex原理下超出方法数的限制问题(三)
android MultiDex 原理下超出方法数的限制问题(三) 插件化?自动化?multiDex?是不是觉得已经懵逼了?请先看这篇文章的内容,在下篇文章中将会详解具体的过程- 随着应用不断迭 ...
- Android 使用android-support-multidex解决Dex超出方法数的限制问题
随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: UNEXPECTED TOP-LE ...
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚(转)
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 (来自时之沙的csdn博客) 随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sd ...
随机推荐
- 浅谈python面向对象编程和面向过程编程的区别
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个个的依次调用即可. 优点:性能高 缺点:相较于面向对象而言,不易维护,不易复用,不易扩展 适合于小型的项目面向对象 ...
- 关于ajax请求不到后台页面提示400 bad request的问题
解决方法一: 在contrller控制器中对应方法的 @RequestMapping注解中添加 method="RequestMethod.POST"属性
- ch-0503
内容来源<算法竞赛进阶指南>date of submission:20191121tags:归排description modelling:你一定玩过八数码游戏,它实际上是在一个3*3的网 ...
- CSAPP lab1——位运算
本次为一次计算机系统实验,就是使用一些基本的运算符来实现函数功能. ps做这些题让我想起大一上学期刚学二进制时被鹏哥支配的痛苦. 知识准备: 1.负数等于正数取反加一. 2.左移一位相当于将这个数扩大 ...
- 应届生offer指南
通用技术 1.一般公司对应届生都要考察编程能力,所以应聘之前先刷刷题.我做面试官出的编程题两年没有变过.就是这道
- VMware虚拟机安装centos7
镜像下载地址:http://www.linuxdown.net/ 在vmware上开始安装CentOS系统,点击菜单新建虚拟机,进入如下图步骤进行操作. 接着进行自定义硬盘操作 最后虚拟机就创 ...
- Cesium专栏-气象雷达动图(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- OpenCV:图像的裁剪
import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(image) plt.axis('off') plt.sh ...
- PyCharm批量修改变量名
方法和 PyCharm重命名文件时更改引用的地方相同
- 求n的阶乘!
编写一个computer类,类中含有一个求n的阶乘的方法,将该类打包, 在另一个包中引入包,在主类中定义computer类的对象,调用求n的阶乘的方法,并输出结果 结果