http://my.oschina.net/gabriel1215/blog/602608

目录[-]

  • 使用MultiDex支持库
  • 注意事项
  • 结论
  • 如果你是一个android开发者,你至少听说过的Dalvik的蛋疼的64K方法限制。概括地说,在一个DEX文件,你可以调用很多的方法,但你只能调用它们最前面的65,536个 ,因为这是在方法调用集合中的所有的空间了。如果你的源代码和狂拽炫酷叼炸天的三方库中方法超过了这个限制。看这篇文章就对了。

    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)

    点此查看更多相关话题

    为了解决这个问题,Android开发社区有人想出了一些解决方案,比如dmarcato的这个,还有casidiablo的这个。他们都是可行的,但是需要一些比较严格的条件。

    最终,Google决定提供一套官方的解决方案,在10月14日的时候发布了MultiDex 支持库,随后几周gradle在 v0.14.0版本中也支持了。

    使用MultiDex支持库

    如果你在使用 Android Studio,这个用起来很简单。如果不是,强烈建议你迁移过来。因为Google很快就会不知处Eclipse插件和旧的基于Ant的系统构建方式。

    第1步 
    添加依赖于你的build.gradle支持MultiDex库

    dependencies { ... compile 'com.android.support:multidex:' ... }

    第2步 
    在buildType或productFlavor中开启multiDexEnabled。

    defaultConfig { ... multiDexEnabled true ... }

    现在,根据你的项目情况,你有3种选择:

    1. 如果你没有创建自己的Application 类,在你的清单文件AndroidManifest.xml中配置android.support.multidex.MultiDexApplication就可以了。

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

    2. 如果你有自己的Application类了,让它继承 android.support.multidex.MultiDexApplication而不是android.app.Application
    3. 如果你的Application继承了其他的类,并且你不想改变或者没办法改变。按照下面的方法重写attachBaseContext()

      public class MyApplication extends FooApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }

    不论你选择上面哪种,都会创建多个大小差不多的dex文件代替单个庞大的dex文件。运行的时候回同事加载所有的这些dex文件。

    当年编译app的时候,Gradle会生成很多个dex文件和一个apk文件让你可以在设备或者模拟器上运行。


    你可以从这个项目看到上面的效果

    注意事项

    Out of memory 问题 
    对于有很多依赖的项目,编译可能因为下面的错误中断

    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" }

    应用启动缓慢 
    根据我们的经验,添加了这个支持库以后,大多数情况下都正常了。这对某些设备,比如Kindle Fire上面,应用启动会比之前慢很多。加载所有的类在应用一启动的时候会花费大量的时间。这就会导致黑屏一段时间,甚至导致ANR.

    更多推荐方案点击这里

    结论

    这个虽然在大多数时候可以解决DEX 64K的问题,但是应该是保留使用。当你尝试使用它以前,请先尝试删除不需要的依赖并且使用ProGuard混淆,如果你必须要使用这个方案。请确保在旧设备上做了测试。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

【转】Android studio 解决64K超出链接数限制问题的更多相关文章

  1. Android Studio 解决 Gradle 依赖冲突的问题

    Android Studio 解决 Gradle 依赖冲突的问题 参考链接: Android Studio(Gradle)解决库依赖冲突问题:http://www.mobibrw.com/2016/3 ...

  2. Android Studio 解决更新慢的问题

    Android Studio 解决更新慢的问题 最近在一些群里有伙伴们反应工具更新慢,由于国内网络对google限制的原因,android studio更新一直是个老大难的问题,为了,提高sdk下载的 ...

  3. Android Studio解决导入项目非常慢的问题

    http://www.androidchina.net/5527.html Android Studio比Eclipse ADT有巨大的优势. Android Studio原生支持使用Gradle来构 ...

  4. android studio 解决avd启动问题 ----waiting for target device come online

    android studio 模拟器打不开,一直停留在第三方.waiting for target  device  come online 问题解决方法 方法1.Android Emulator 未 ...

  5. Android Studio解决导入项目非常慢

    Android Studio比Eclipse ADT有巨大的优势.Android Studio原生支持使用Gradle来构建项目,使用动态语言Groovy定义项目构建的过程,避免了build.xml文 ...

  6. Android Studio解决unspecified on project app resolves to an APK archive which is not supported

    出现该问题unspecified on project app resolves to an APK archive which is not supported as a compilation d ...

  7. Android Studio解决Error:moudle not specified

    在使用Android Studio 进行Builder APKs的时候,如果发现无法degub, 进行配置的时候 没有module可以进行指定,如果所示(借个图) 问题的原因一般是Grade File ...

  8. Android Studio 解决ADB检测不到手机导致无法连接的问题

    ADB的全称是Android Debug Bridge,是用来管理模拟器和真机的通用调试工具. 开USB调试 方法:手机设置 - 开发人员选项 - USB调试 - 勾选(开发者调试被隐藏了,在关于手机 ...

  9. 【转载】Please configure Android Sdk(android studio)解决办法

    https://blog.csdn.net/u011622280/article/details/79005453 studio就报Please configure Android Sdk,重启and ...

随机推荐

  1. 纸上谈兵:栈(stack)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 栈(stack)是简单的数据结构,但在计算机中使用广泛.它是有序的元素集合.栈最显 ...

  2. 网站实现特定某个地区访问执行跳转(js方法)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. Ubuntu上安装MongoDB(译)

    add by zhj:直接从第四步开始就可以了,而且安装好MongoDB后会自动启动的,不必自己去执行启动命令 原文:https://docs.mongodb.com/manual/tutorial/ ...

  4. avalon2学习教程13组件使用

    avalon2最引以为豪的东西是,终于有一套强大的类Web Component的组件系统.这个组件系统媲美于React的JSX,并且能更好地控制子组件的传参. avalon自诞生以来,就一直探索如何优 ...

  5. JS根据服务器时间倒计时

    原文链接:http://caibaojian.com/daojishi-2.html //获取服务器时间 function getSevertime(){ var xmlHttp = new XMLH ...

  6. .c文件如何编译为ko的MAKEFILE文件编写

    首先需要知道: obj-m = *.o obj-y = *.o 上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件. 生成KO文件,分两种情况:单个.c文件和多个.c文 ...

  7. [转]LIBSVM-3.18在python环境下的使用

    http://blog.csdn.net/lj695242104/article/details/39500039 1)安装Python,直接去官方网站 2)运行“cmd”,直接输入python,查看 ...

  8. RabbitMQ 学习记录

    rabbit mq知识点:1.消费时可以通过acknowledge设定消费是否成功,消费不成功时在server端requeue2.需要注意两个持久化:queue持久化和消息持久化(通过代码设定,默认即 ...

  9. [原创]Spring MVC 学习 之 - URL参数传递

    原文参考地址: http://www.cnblogs.com/rhythmK/p/3971191.html 目的和缘由: 本人想做一个分享的页面,分析给朋友注册,注册按分享ID进行级联; 过程: 很多 ...

  10. VC++6.0 Debug单步调试

    相信大家对谭浩强童鞋都不陌生,想当年,是他 引领我们步入了C的殿堂,我们从他那里学会了如何写代码,他却没有教我们如何Debug,而我们伟大的老师,也对此只字不提.相信很少有人可以一次性写出 完全正确的 ...