Android DEX方法超过64K和gradle编译OOM解决方案
来源:互联网 发布:mysql 高级sql语句 编辑:程序博客网 时间:2024/05/29 17:19
首先贴上报错信息:Error:Execution failed for task ':app:transformClassesWithDexForDebug'.> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 2
使用Android studio开发的小伙伴肯定都会遇到过这个错误,出现这个错误一般情况是项目中存在冲突了,我一看到这个错误的时候好淡定,因为本人之前遇到过,就是lib里面存在有重复的jar库文件,于是第一时间就去检查自己的lib下是否存在有重复的jar文件,于是检查半天发现并没有重复的jar,于是查看build.gradle文件dependencies是否有重复的,可是还是没发现有重复的.到网上各种百度,各种谷歌,大多数会说是加载有重复的jar文件,或者是jdk版本的问题(其实出现这个问题一般跟jdk版本是没多大关系的).
一直寻找编译不过的原因,于是我把代码恢复到之前的版本,发现项目可以编译通过毫无问题,只要加入新代码就出现这个问题,于是我有重复地检查我的代码是否有什么问题,检查了N次依然不知道是什么原因,后面我尝试着删除最新加入的一个JavaBean 类,可以编译通过.感觉到问题好奇怪,于是我就想是不是项目中dex方法超过了64K的上限,通过多次反复的验证,我最终确定果然是这个问题.这就坑爹了,这报错报的那么笼统,对于第一次遇到这种问题的我真的是够了.
错误的原因是这样的,在一个DEX文件,你可以调用很多的方法,但你只能调用它们最前面的65,536个 ,因为这是在方法调用集合中的所有的空间了。Google提供一套官方的解决方案,在10月14日的时候发布了MultiDex 支持库,随后几周gradle在 v0.14.0版本中也支持了。如果你在使用 Android Studio,这个用起来很简单。如果不是,强烈建议你迁移过来。因为Google很快就会不知处Eclipse插件和旧的基于Ant的系统构建方式。
下面是解决这个问题的步骤:
第1步
添加依赖于你的build.gradle支持MultiDex库
dependencies { ... compile 'com.android.support:multidex:1.0.0' ... }
第2步
在buildType或productFlavor中开启multiDexEnabled。
defaultConfig { ... multiDexEnabled true ... }
现在,根据你的项目情况,你有3种选择:
如果你没有创建自己的Application 类,在你的清单文件AndroidManifest.xml中配置
android.support.multidex.MultiDexApplication
就可以了。.... android:name="android.support.multidex.MultiDexApplication" ...
- 如果你有自己的Application类了,让它继承
android.support.multidex.MultiDexApplication
而不是android.app.Application,并在你的Application类添加下面方法
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
如果你的Application继承了其他的类,并且你不想改变或者没办法改变。按照下面的方法重写
attachBaseContext()
public class MyApplication extends FooApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
不论你选择上面哪种,都会创建多个大小差不多的dex文件代替单个庞大的dex文件。运行的时候回同加载所有的这些dex文件。
当你做了上面的配置之后再次进行编译,那也不一定能编译通过,可能会出现另外一个错误:
java.lang.OutOfMemoryError: GC overhead limit exceeded
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 3
对于有很多依赖的项目,编译可能因为下面的错误中断
Error:Execution failed for task ':app:dexDebug'. ... Error Code: 3 Output: UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: GC overhead limit exceeded at com.android.dx.cf.cst.ConstantPoolParser.parse0(ConstantPoolParser.java:326) ...
在build.gralde android标签下面添加下面代码可以解决
dexOptions { incremental true javaMaxHeapSize "4g" }
- Android DEX方法超过64K和gradle编译OOM解决方案
- DEX 方法超过64K限制和gradle编译OOM问题解决
- DEX 方法超过64K限制和gradle编译OOM问题解决
- (2.2.8.4 & 4.4.15.1)Gradle:multiDexEnabled之DEX 方法超过64K限制和gradle编译OOM问题解决
- DEX 方法超过64K限制和gradle编译OOM问题解决,异常名:Error:Execution failed for task ':app:dexDebug'. > com.android.ide
- android studio DEX 方法超过64K限制和gradle编译OOM问题解决,异常名:Error:Execution failed for task ':app:dexDebug'. >
- android studio DEX 方法超过64K限制和gradle编译OOM问题解决,异常名:Error:Execution failed for task ':app:dexDebug'. >
- android方法数超过64k和Gradle编译OOM解决方法
- Android DEX 方法超过64K限制
- Android开发 方法总数超过64K时,dex分割(Android Studio)
- 使用ANT编译超过64K方法的Android工程
- Android打包编译超过64K 解决办法
- (配置超过64K方法的应用程序)com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
- 如何处理 android 方法总数超过 65536 . the number of method references in a .dex file exceed 64k
- android方法数超过64k解决方法
- Android Studio 中方法数65536 或超过64K的解决方案
- 安卓应用方法数超过64k解决办法:分割Dex
- 方法数超过64K解决方案(MultiDex)
- android 实现类似知乎 上推隐藏头尾 下拉出现头尾的Demo
- 云存储应用场景全总结 – 音视频篇
- 使用日期和时间表单帮助方法
- zookeeper知识点二(更新节点数据)
- Code forces 275C-----思维---二分
- Android DEX方法超过64K和gradle编译OOM解决方案
- 图解Android Studio 2.0安装步骤
- 110. Balanced Binary Tree
- (总结)CentOS Linux下VNC Server远程桌面配置详解
- 详解多旋翼飞行器的传感器技术
- hdu5753(2016多校第三场,数学题)
- 【POJ】-1979-Red and Black(DFS)
- 判断一个十进制数是几位数
- js 判断手机类型脚本