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. 洛谷P3378 【模板】堆

    P3378 [模板]堆 160通过 275提交 题目提供者HansBug 标签 难度普及- 提交  讨论  题解 最新讨论 经实际测试 堆的数组开3000- 题目有个问题 为什么这个按课本堆标准打的- ...

  2. leetcode-【简单题】Two Sum

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  3. java新项目的eclipse统一配置记录

    1.new java file的模版 /** * @Title:${file_name} * @Copyright: Copyright (c) 2016 * @Description: * < ...

  4. 小杨同学git使用记(适合使用过git但是不熟练的童鞋)

    首先声明:这不是一篇git使用手册或者指南,如果要详细的git使用指南,下面是廖雪峰的git教程,可以系统学习廖雪峰的git教程,当然,如果你想马上以一种正确的方式使用git,那么接下来你很快就会学会 ...

  5. git免密码pull,push

    执行git config --global credential.helper store

  6. jstl格式化数字

    jstl中的<fmt:formatNumber>标签   设置显示时间戳<%    request.setAttribute("currentTimeStamp" ...

  7. position:absolute、float、display:inline-block 区别

    position: absolute会导致元素脱离文档流,被定位的元素等于在文档中不占据任何位置,在另一个层呈现,可以设置z-index.PS的图层效果就是position: absolute. fl ...

  8. poj3241 曼哈顿最小距离生成树第k大的边

    思路: 已知: 要生成曼哈顿距离最小生成树,一个点最多和四周8个点连线,那8个点分别是将那个点四周360度平分成8个区间,每个区间里面和那个点曼哈顿距离最小的点,所以如果有n个点,那么最多有4n条边, ...

  9. NLPP-02-Exercises

    <PYTHON自然语言处理>第2章 内容简介:各种文本语料库. 古腾堡项目 www.gutenberg.org OLAC元数据格式档 http://www.language-archive ...

  10. ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆AnalyzerTool分词工具.非常实用!

    AnalyzerTool分词工具.非常实用! 可以查看某串字符最终被分割成什么样子,这样便于查询时深刻明白为什么有的查不到有的却能查到. package com.isoftstone.www.tool ...