天天看点

Android使用multidex解决方法数越界问题65536

概述:

QQ群:372135639

在Android中单个dex文件能包含的最大方法数为 65536 。 这个方法数目来自,Android FrameWork,一依赖包,已经代码中包含的方法,还有些项目使用的第三方库里面的方法 的总和。

乍一看这个数字很大,一般不会超过。但是随着App的更新速度火箭般提高,和用户的各种需求大量增加,最终在产品的指挥下,项目越来越大。现如今,只要是比较大型的项目,都会遇到 65536 问题。

问题描述:

1.当dex方法数超过65536,我们会遇到这种情况:

无法正常编译,异常提示如下:

Error:Execution failed for task ':duchazhushou:dexRelease'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\jeff\AppData\Local\Android\sdk\android-sdk\build-tools\21.1.1\dx.bat --dex --output D:\dev\android\Duchazhushou_TDT\duchazhushou\build\intermediates\dex\release --input-list=D:\dev\android\Duchazhushou_TDT\duchazhushou\build\intermediates\tmp\dex\release\inputList.txt
Error Code:
    2
Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
        at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
        at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
        at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302)
        at com.android.dx.command.dexer.Main.run(Main.java:245)
        at com.android.dx.command.dexer.Main.main(Main.java:214)
        at com.android.dx.command.Main.main(Main.java:106)
           

2.还有一种情况,并非是方法数超出65536,会出现在低版本手机安装Apk时,异常停止。(这种情况,我们放在以后再说,今天主要解决AS multidex问题)

如今的博客论坛上,解决65536问题,大多是把dex拆分多个,即:分包。其实对于现在的项目来说,这种高强度的代码改动,非常繁琐麻烦。我不推荐。

Eclipse处理65536相当麻烦,必须在项目中加入gradle,然后用google的muldex进行分包。

所以我们今天只讨论AS解决65536的方法:

首先要使用包含 Android SDK Build Tools  或者以上版本的编译环境。

 在 app --> build.gradle --> defaultConfig --> 添加multiDexEnabled  true

 dependencies --> 添加multidex依赖 ( complie 'com.android.support:multidex:1.0.0')
           

配置方面完成后,我们需要在代码上添加multidex支持:

三种方法:

  1. Application 继承MultiDexApplication
    Android使用multidex解决方法数越界问题65536
  2. 在manifest中指定Application为MultiDexApplication
<Application
    android:name="android.support.multidex.MultiDexApplication"
    android:allowBackup="ture"
    android:theme=“@Style/AppTheme"
    android:label="@Style/app_name"
    android:icon="@mipmap/ic_launcher"
>
</Application>
           

3.在 继承Application的主方法类 重写 attachBaseContext方法 【注意:此方法要比 onCreter 提前】

public class MainApplication extends Application{

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

完成以上操作,就可以避免65536问题呐!

—– 温故而知新可以为师矣。

继续阅读