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

但使书种多,会有岁稔时。这篇文章主要讲述安卓应用方法数超过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.html
如果你觉得看英文文档累,那就跟小编一起,使用Google官网提供的分包策略(即:分割Dex)解决方法数超64k限制问题吧。 
但是对于eclipse编译器来说,怎么办呢?看来你要使用Google官网解决方案只能先想办法将项目搬家到AndroidStudio上了。 
【也许网上有更好的解决方案,比如使用插件化框架:https://github.com/singwhatiwanna/dynamic-load-apk】
我还是觉得Google官网的解决方案比较靠谱,那么开始吧。
第一步:引入Google提供的multidex库(com.android.support:multidex:1.0.1)

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

文章图片

第二步:开启multiDexEnabled(即:在defaultConfig中添加属性:multiDexEnabled true)
安卓应用方法数超过64k解决办法(分割Dex)

文章图片

第三步:将项目原Application更改为MultiDexApplication
此时有两种情况:
1> 如果你的项目没有重写Application类,那么你只需要更改AndroidManifest.xml文件的application标签,即在application标签下添加属性:android:name=”android.support.multidex.MultiDexApplication”即可。 
安卓应用方法数超过64k解决办法(分割Dex)

文章图片

2> 如果你的项目重写了Application类,那么你需要将你的Application类去除继承android.app.Application,改为继承android.support.multidex.MultiDexApplication类,然后重写attachBaseContext(Context base); 方法,并对MultiDex进行初始化即可。如下:
public class MyApplication extends MultiDexApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); // 初始化 } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
这时候分包就完成了。
另外请注意:Out of memory 问题
1> 对于有很多依赖的项目,编译可能因为下面的错误中断
Error:Execution failed for task ‘:app:dexDebug‘. Error Code:3 Output: UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: GC overhead limit exceeded at...

  • 1
  • 2
  • 3
  • 4
  • 5
解决办法: 
编辑app下build.gralde文件,在android下添加如下属性即可:
dexOptions { incremental true javaMaxHeapSize ‘2g‘ }

  • 1
  • 2
  • 3
  • 4
2> 如果你的项目有一些依赖库(Module)项目,希望你在其build.gralde文件的defaultConfig中也添加属性:multiDexEnabled true 
安卓应用方法数超过64k解决办法(分割Dex)

文章图片

至此,分包策略就介绍完了。基本上可以解决掉方法数超过64k限制问题。但是也会有一些副作用,比如导致项目启动非常缓慢甚至ANR。
【安卓应用方法数超过64k解决办法(分割Dex)】 









    推荐阅读