- 浏览: 28278 次
最新评论
如果你是一个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种选择:
如果你没有创建自己的Application 类,在你的清单文件AndroidManifest.xml中配置android.support.multidex.MultiDexApplication就可以了。
.... android:name="android.support.multidex.MultiDexApplication" ...
如果你有自己的Application类了,让它继承 android.support.multidex.MultiDexApplication而不是android.app.Application
如果你的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文件让你可以在设备或者模拟器上运行。
enter image description here
你可以从这个项目看到上面的效果
注意事项
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混淆,如果你必须要使用这个方案。请确保在旧设备上做了测试。
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种选择:
如果你没有创建自己的Application 类,在你的清单文件AndroidManifest.xml中配置android.support.multidex.MultiDexApplication就可以了。
.... android:name="android.support.multidex.MultiDexApplication" ...
如果你有自己的Application类了,让它继承 android.support.multidex.MultiDexApplication而不是android.app.Application
如果你的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文件让你可以在设备或者模拟器上运行。
enter image description here
你可以从这个项目看到上面的效果
注意事项
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混淆,如果你必须要使用这个方案。请确保在旧设备上做了测试。
发表评论
-
Xcode9解决exportArchive: requires a provisioning profile
2017-09-23 15:15 1180https://stackoverflow.com/quest ... -
缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor”
2017-09-09 15:05 1022//缺少编译器要求的成员“ystem.Runtime.Com ... -
[转]帧同步和状态同步
2017-03-06 12:22 659转自:http://www.gameres.c ... -
非对称加密和数字证书原理
2017-03-01 17:34 581http://www.cnblogs.com/JeffreyS ... -
Unity模糊查找MonoBehaviour
2016-11-23 17:32 1177using System; using System.Co ... -
Unity问题备份
2016-10-09 11:19 7371. Could not find file " ... -
链接-Unity Assetbundle使用填坑
2016-09-08 11:53 648http://www.cnblogs.com/ybgame/p ... -
协程执行顺序测试备份
2016-09-01 18:28 491using UnityEngine;using Syste ... -
[转]简单粗暴的so加解密实现
2016-08-12 17:03 821http://bbs.pediy.com/showthread ... -
svn 413 Entity too large
2016-06-29 20:58 774在apache配置conf文件中添加 LimitXMLRequ ... -
[转]gradle打不同渠道的包
2016-06-27 18:29 686美团Android自动化之旅— ... -
IPv4 regex
2016-06-07 12:12 451private static Regex ipv4Reg = ... -
[转]unity3d使用winphone平台的问题
2016-05-25 12:18 507最近在移植u3d的游戏到WindowsPhone8上,Wind ... -
[转]Deep link是什么
2016-05-23 12:06 701http://www.open-open.com/lib/vi ... -
苹果和google play审核时注意的问题
2016-05-16 15:18 755苹果测试沙盒充值不能用越狱手机来测 google play测试 ... -
C# MSDN地址备忘
2016-05-14 19:20 476https://msdn.microsoft.com/zh-c ... -
Windows API错误码
2016-05-14 19:19 359https://msdn.microsoft.com/en-u ... -
java 坑收集
2016-05-06 20:15 3511. Strng.getBytes() 一定要指明用的是什么编 ... -
[转]iphone不越狱抓包
2016-04-27 20:42 992Remote Virtual Interface 在iOS ... -
[转]C#程序员容易犯的10个错误
2016-04-25 16:04 372http://www.oschina.net/translat ...
相关推荐
在Android系统中,Dalvik和ART(Android RunTime)虚拟机有一个65536个方法引用的限制,这被称为Dalvik方法数限制或64K问题。如果一个APK超过了这个限制,编译和安装过程可能会遇到问题。因此,开发者需要定期检查...
【安卓APK的傻瓜式反编译打包工具】是一种专为Android应用程序(APK)设计的工具,它简化了对APK文件的反编译和重新打包过程,使得开发者或者逆向工程师能够轻松地查看、修改和分析APK内部的资源与代码。这种工具...
解决方法分Android 5.0及以上系统和5.0以下系统怎么做。客官们不要着急,先看我一个个分析原因,毕竟我要装下逼哈哈。 一、Android 5.0以下的版本 Android 5.0(API leve 21)之前的系统使用Dalvik执行应用程序代码...
本文将详细介绍如何在Linux环境下利用源码编译Android系统的APK和可执行命令。 首先,我们要确保环境配置正确。在Linux系统中,设置Android SDK和NDK的路径是非常重要的一步。在终端中输入以下命令来设置环境变量:...
### Android 反编译与smali语法:ROM适配的关键技术 #### 一、引言 在Android开发领域,反编译技术与smali语法的应用是进行深度定制、ROM适配以及逆向工程的重要手段。smali作为一种中间语言,与dalvik虚拟机紧密...
通过以上介绍,我们了解到如何使用多DEX技术解决Android应用中遇到的“65K方法限制”问题,以及如何在项目配置和代码优化方面应对这一挑战。尽管多DEX带来了一些额外的复杂性,但它是当前大型Android应用不可或缺的...
### Android中安装Asset下的APK 在Android开发中,有时候我们可能会遇到需要动态加载或安装应用内部资源(如APK)的需求。本文将详细介绍如何在Android应用中安装存储于`assets`目录下的APK文件。 #### 一、背景...
echo apk.outpath=D:\\androidAPK_Signed\\%%k.apk>>build\%%j\build.properties ) ``` #### 六、总结 通过以上步骤,我们可以实现Android项目的自动编译、打包以及签名功能,极大地提高了开发效率。同时,利用...
5. **处理编译问题**:在将POI库包含到Android项目时,可能会遇到Dalvik Executable (DEX)文件大小超过64K方法限制的问题。这时,可以使用`multiDexEnabled true`设置来启用多DEX支持,并可能需要使用ProGuard进行...
在IT行业中,Android应用开发是极其活跃的一个领域,而“反编译”是与之相关的关键技术之一。Android应用通常是以APK(Android Package)格式存在的,它包含了Java字节码和资源文件。开发者有时需要对APK进行反编译...
这份资料旨在帮助开发者理解和掌握Android开发中的编译技术,从而优化性能、提高效率并解决可能出现的问题。以下是对Android编译过程的详细阐述: 一、Android应用编译过程 1. **源码准备**:Android应用主要由...
在Android 5.0及更高版本中,ART引入了多DEX支持,允许在一个APK中包含多个DEX文件,以解决单一DEX文件方法数量的限制(64K方法限制)。在Android Studio中,当你构建应用时,Gradle会自动处理多DEX配置,生成对应的...
在Android系统中,Dalvik虚拟机(或ART)有一个方法数限制,通常为65536个,这被称为64K方法限制。如果一个APK超出这个限制,就会导致编译失败。因此,开发者需要通过此工具来监控应用的方法数量,以便进行优化: 1...
android 反编译 非常好用 主要功能: 1、反编译.apk 对.apk文件进行反编译。 2、重建.apk 根据反编译.apk得到目录重建.apk文件。 3、签名.apk 对.apk文件进行签名。 4、优化.apk 对.apk文件进行优化。 5、...
ijkplayer是Android平台上一款广泛应用的开源视频播放器,它的核心基于FFmpeg项目,...在0.8.8版本中,用户可以期待更加稳定、高效的播放体验,同时也应该关注官方文档和社区,以便获取最新的技术信息和问题解决方案。
在Cocos2d-x开发中,对于Android平台的构建过程,常常涉及到Java文件的编译。Cocos2d-x是一个跨平台的游戏开发框架,它允许开发者使用C++编写游戏逻辑,然后通过绑定到各种平台的原生API来实现平台间的兼容性。在...
描述中提到的"genymotion-arm-translation-Marshmallow"与标题相吻合,强调了这个工具是专门针对Android 6.0 (Marshmallow)版本的Genymotion进行优化,旨在解决由于架构不匹配导致的APK安装失败问题。在Android 6.0...
在Android开发中,由于Dalvik虚拟机和ART运行时环境的限制,每个APK文件内的 Dex(Dalvik Executable)文件最多只能包含65536个方法引用,这个限制被称为64K方法数限制。当应用的方法数超过这个限制时,就会遇到编译...
2. **多DEX处理**:当应用DEX文件超过64K方法限制时,需要拆分为多个DEX。优化此过程,确保加载速度快且无错误。 3. **优化 DexSplitter**:合理设置DexSplitter策略,例如按功能模块划分DEX,可减少启动时需加载的...