异常com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

来源:互联网 发布:程序员的发展 编辑:程序博客网 时间:2024/05/18 03:26

使用CoordinatorLayout时,要引用:

compile 'com.android.support:design:25.0.1'
结果出现异常:

Error:Execution failed for task ':main:transformClassesWithDexForDebug'.> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
异常的原因就是在工程中引入了多个第三方jar包,导致调用的方法数超过了android设定的65536个(DEX 64K problem),进而导致dex无法生成,也就无法生成APK文件。这么一来就编译的时候就会生成一个非常庞大的dex文件,Google官方对于这种问题的解决方案是分包例如classes.dex classes2.dex。

解决方案:

第1步:在build.gradle添加你MultiDex依赖

 dependencies {     compile 'com.Android.support:multidex:1.0.1' } 

注意:我加了这句之后出现异常:

Error:Failed to resolve: com.Android.support:multidex:1.0.1
然后我就没有加这个依赖,好像也可以。

或者直接在module的libs下添加jar文件,记住在libs下引入此文件时,如果其他的module存在此包的引用,千万不要Add As Library,否则有可能会报如下的错误

java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex.class 

第2步:在build.gradle中开启mulitDexEnabled

defaultConfig {     multiDexEnabled true } 
这里注意,有多个module的时候,我是在主module下加这句才有效。
第3步:在application里添加代码,需要根据自身的情况来处理,以下分3种情况:
 情况一、如果你的app中没有写Application类,那么直接在清单文件androidManifest.xml中配置标签中添加属性即可

android:name="android.support.multidex.MultiDexApplication" 
 

情况二、如果你已经有了自己的Applcation类,那么直接让这个Application类继承自android.support.multidex.MultiDexApplication而不是android.app.Application
 
 情况三、如果你已经有了自己的Application而又不想修改或不能修改已有继承父类,那么按照下面的方法重写attachBaseContext()方法

@Override protected void attachBaseContext(Context base) {     super.attachBaseContext(base);     MultiDex.install(this); } 

 不论以上三种情况你选择哪一种,都会编译出许多差不多大小的dex文件来替代一个庞大的dex文件,运行的时候同时加载所有的dex文件。 当你编译的时候会生成多个dex文件和一个apk文件供你在安卓设备上运行。

    Android 既然出现这种问题,那么也有可能会出现OutOfMemory的问题

 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) ..

 在app的build.gradle下的android标签下添加以下代码

 dexOptions {     incremental true     javaMaxHeapSize "4g" }

参考:

http://www.ytsyt.cn/post/10.html



阅读全文
0 0
原创粉丝点击