使用android-support-multidex解决Android方法数超过65535的问题

随着应用不断更新,业务的不断增加, 应运而生的应用可能需要集成了各种第三方library,相信很多人都遇到过如下类似的错误:

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:501)
at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:282)
at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:490)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:167)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103) 

这就是你的App中方法数超过了65535了,那这种问题发生的具体原因是什么呢?

在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。这里需要强调的是,Dex和Jar一样是一个归档文件,里面仍然是Java代码对应的字节码文件。当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。但是在早期的Android系统中,DexOpt有一个问题,也就是这篇文章想要说明并解决的问题。DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的Android系统做兼容.

下面就说下使用android-support-multidex的具体配置

  1. 在build.gradle中打开multidex的支持
android {
    compileSdkVersion 23
    buildToolsVersion "25"
    defaultConfig {
        ...
        minSdkVersion 18
        targetSdkVersion 20
        ...
        // Enable multidex support.
        multiDexEnabled true
    }
    ...
}

2.引入multidex的库依赖

dependencies {
  compile ‘com.android.support:multidex:1.0.0‘
} 

3.配置Application,以下两种方式任选其一即可

  • 继承MutiDexApplication
public class BsApplication extends MutiDexApplication {
}
  • 覆写Application中的attachBaseContext()方法
public class BsApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

常见问题

1. DexException: Library dex files are not supported in multi-dex mode错误


Error:Execution failed for task ‘:app:dexDebug‘.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    $ANDROID_SDK/build-tools/android-4.4W/dx --dex --num-threads=4 --multi-dex
    ...
  Error Code:
    2
  Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Library dex files are not supported in multi-dex mode
        at com.android.dx.command.dexer.Main.runMultiDex(Main.java:322)
        at com.android.dx.command.dexer.Main.run(Main.java:228)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)  

这是由于dex 的multi-dex 选项设置与预编译的library工程有冲突,因此如果你的应用中包含引用的lirary工程,需要将预编译设置为false:

android {
    dexOptions {
        preDexLibraries = false
    }
} 

2.OutOfMemoryError: Java heap space错误

UNEXPECTED TOP-LEVEL ERROR:
java.lang.OutOfMemoryError: Java heap space 

这是因为堆栈内存不足造成的,在dexOptions中增加java堆栈内存大小

android {
    dexOptions {
        javaMaxHeapSize "2g"
    }
}  
时间: 2024-12-25 08:53:45

使用android-support-multidex解决Android方法数超过65535的问题的相关文章

android 方法数超过65k,解决dex方法数超过65536

最近有朋友在问我,为什么我就加了一个类/一个库突然跑不起来了. 排查方式: 1.确认你的代码/引用没有问题 2.检查是否是65k问题 今天主要是解决 排查方式2的步骤,这个原因主要是因为你的apk包方法数过大. 现在解决这个已经很方便了: 方式一(繁琐):程序分包,这个比较繁琐:需要对jvm加载Class的方式有足够的了解 方式二(快速,使用AS): 1.使用google提供的分包库 implementation 'com.android.support:multidex:1.0.2' impl

Android工程方法数超过65535的解决办法

Error:Execution failed for task ':ttt:transformClassesWithDexForDebug'.com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowExcep

APK方法数超过65535及MultiDex解决方案

以下参考自官方文档配置方法数超过 64K 的应用 随着 Android 平台的持续成长,Android 应用的大小也在增加.当您的应用及其引用的库达到特定大小时,您会遇到构建错误,指明您的应用已达到 Android 应用构建架构的极限.早期版本的构建系统按如下方式报告这一错误: Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536 较新版本的 Android 构

解决安卓中单个dex方法数超过65535的方法

1.百度下载  60K-methods.jar包,复制至libs文件夹中,添加到gradle中 2.在build.gradle中的defaultConfig{}下添加 multiDexEnabled true 3.  方法一.在manifest文件中,application下添加  android:name= "android.support.multidex.MultiDexApplication" 方法二.新建Application类,在onCreate方法中,添加方法 Multi

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

你的安卓项目功能很强大,对接了好多第三方开源库,项目越做越完善,代码越敲越爽.可是突然有一天报异常了. 错误:The number of method references in a .dex file cannot exceed 64K. 编译器提醒你,你的项目方法数超过64k了. AndroidStudio会提醒你: Learn how to resolve this issue at https://developer.android.com/tools/building/multidex

Android应用解决65K方法数限制

近日,Android Developers在Google+上宣布了新的Multidex支持库,为方法总数超过65K的Android应用提供了官方支持. 如果你是一名幸运的Android应用开发者,正在开发一个前景广阔的应用,不断地加入新功能.添加新的类库,那么终有一天,你会不幸遇到这个错误: Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536 这个错误是And

android studio:::解决方法数超过65536的方法,三步

1.在build.gradle(Module: app) 中的defaultConfig{}中添加 multiDexEnabled true 2.在build.gradle(Module: app) 中的dependencies{}中添加 compile 'com.android.support:multidex:1.0.0' 3.在你自定义继承于Application的类里面重写attachBaseContext(Context base)方法 方法中加一行代码 MultiDex.instal

Android开发中方法数超过65535的简单解决方法

有时候我们的项目会依赖很多第三方的Module,当方法数超过了65535的时候会在打包成apk的时候失败. 对于这种情况,Google官方提供了一个补丁包,将我们的项目进行分包处理. 第一步: 修改项目中所有需要打包的Module的build.gradle. 1.添加 multiDexEnabled = true.如: defaultConfig { applicationId "com.biketo.rabbit" minSdkVersion 15 targetSdkVersion

解决方法数超65535问题

构建工具: ANT: 在project.properties文件中添加dex.force.jumbo=true 1.生成一个超大的dex             2.优化方法数降至满足条件即可(和混淆包的优化方法数有所区别)             3.如果方法数超过很多也不能运行             4.该属性没经过大量测试验证所以打包发布切记不要加这个属性 Gradle:multiDexEnabled true