`
wanzhanzhuce
  • 浏览: 27538 次
社区版块
存档分类
最新评论

[转]android解决apk编译方法数超过64k的问题

阅读更多
如果你是一个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混淆,如果你必须要使用这个方案。请确保在旧设备上做了测试。
分享到:
评论

相关推荐

    dex-method-counts.jar统计Android apk中方法数目

    在Android系统中,Dalvik和ART(Android RunTime)虚拟机有一个65536个方法引用的限制,这被称为Dalvik方法数限制或64K问题。如果一个APK超过了这个限制,编译和安装过程可能会遇到问题。因此,开发者需要定期检查...

    安卓APK的傻瓜式反编译打包工具

    【安卓APK的傻瓜式反编译打包工具】是一种专为Android应用程序(APK)设计的工具,它简化了对APK文件的反编译和重新打包过程,使得开发者或者逆向工程师能够轻松地查看、修改和分析APK内部的资源与代码。这种工具...

    解决Android单个dex文件不能超过65535个方法的类库

    解决方法分Android 5.0及以上系统和5.0以下系统怎么做。客官们不要着急,先看我一个个分析原因,毕竟我要装下逼哈哈。 一、Android 5.0以下的版本 Android 5.0(API leve 21)之前的系统使用Dalvik执行应用程序代码...

    利用源码编译Android系统的APK和可执行命令的方法

    本文将详细介绍如何在Linux环境下利用源码编译Android系统的APK和可执行命令。 首先,我们要确保环境配置正确。在Linux系统中,设置Android SDK和NDK的路径是非常重要的一步。在终端中输入以下命令来设置环境变量:...

    Android 反编译和smali语法用于ROM适配

    ### Android 反编译与smali语法:ROM适配的关键技术 #### 一、引言 在Android开发领域,反编译技术与smali语法的应用是进行深度定制、ROM适配以及逆向工程的重要手段。smali作为一种中间语言,与dalvik虚拟机紧密...

    解决Android单个dex文件限制65536个方法问题

    通过以上介绍,我们了解到如何使用多DEX技术解决Android应用中遇到的“65K方法限制”问题,以及如何在项目配置和代码优化方面应对这一挑战。尽管多DEX带来了一些额外的复杂性,但它是当前大型Android应用不可或缺的...

    Android中安装asset下的apk

    ### Android中安装Asset下的APK 在Android开发中,有时候我们可能会遇到需要动态加载或安装应用内部资源(如APK)的需求。本文将详细介绍如何在Android应用中安装存储于`assets`目录下的APK文件。 #### 一、背景...

    ANDROID_ANT自动编译打包签名教程

    echo apk.outpath=D:\\androidAPK_Signed\\%%k.apk>>build\%%j\build.properties ) ``` #### 六、总结 通过以上步骤,我们可以实现Android项目的自动编译、打包以及签名功能,极大地提高了开发效率。同时,利用...

    Android通过POI完美解析Excel.xls xlsx成html编译前jar包

    5. **处理编译问题**:在将POI库包含到Android项目时,可能会遇到Dalvik Executable (DEX)文件大小超过64K方法限制的问题。这时,可以使用`multiDexEnabled true`设置来启用多DEX支持,并可能需要使用ProGuard进行...

    android 反编译.

    在IT行业中,Android应用开发是极其活跃的一个领域,而“反编译”是与之相关的关键技术之一。Android应用通常是以APK(Android Package)格式存在的,它包含了Java字节码和资源文件。开发者有时需要对APK进行反编译...

    android编译大全

    这份资料旨在帮助开发者理解和掌握Android开发中的编译技术,从而优化性能、提高效率并解决可能出现的问题。以下是对Android编译过程的详细阐述: 一、Android应用编译过程 1. **源码准备**:Android应用主要由...

    对apk文件的dex分解

    在Android 5.0及更高版本中,ART引入了多DEX支持,允许在一个APK中包含多个DEX文件,以解决单一DEX文件方法数量的限制(64K方法限制)。在Android Studio中,当你构建应用时,Gradle会自动处理多DEX配置,生成对应的...

    apk配置信息查看工具

    在Android系统中,Dalvik虚拟机(或ART)有一个方法数限制,通常为65536个,这被称为64K方法限制。如果一个APK超出这个限制,就会导致编译失败。因此,开发者需要通过此工具来监控应用的方法数量,以便进行优化: 1...

    ApkToolkit v3.0

    android 反编译 非常好用 主要功能: 1、反编译.apk 对.apk文件进行反编译。 2、重建.apk 根据反编译.apk得到目录重建.apk文件。 3、签名.apk 对.apk文件进行签名。 4、优化.apk 对.apk文件进行优化。 5、...

    cocos2dx android编译java文件

    在Cocos2d-x开发中,对于Android平台的构建过程,常常涉及到Java文件的编译。Cocos2d-x是一个跨平台的游戏开发框架,它允许开发者使用C++编写游戏逻辑,然后通过绑定到各种平台的原生API来实现平台间的兼容性。在...

    genymotion-ARM-Translation-6-andoroid解决genymotion安卓6.0安装不了apk软件问题 2.zip

    描述中提到的"genymotion-arm-translation-Marshmallow"与标题相吻合,强调了这个工具是专门针对Android 6.0 (Marshmallow)版本的Genymotion进行优化,旨在解决由于架构不匹配导致的APK安装失败问题。在Android 6.0...

    MultiDex android

    在Android开发中,由于Dalvik虚拟机和ART运行时环境的限制,每个APK文件内的 Dex(Dalvik Executable)文件最多只能包含65536个方法引用,这个限制被称为64K方法数限制。当应用的方法数超过这个限制时,就会遇到编译...

    APK_ODEX优化

    2. **多DEX处理**:当应用DEX文件超过64K方法限制时,需要拆分为多个DEX。优化此过程,确保加载速度快且无错误。 3. **优化 DexSplitter**:合理设置DexSplitter策略,例如按功能模块划分DEX,可减少启动时需加载的...

    apktool反编译工具

    在Android应用开发中,有时我们需要对APK文件进行反编译,以便查看其内部结构、修改资源或进行安全分析。Apktool是一个强大的开源工具,专为此目的设计。它允许开发者将APK文件解包为源代码形式,便于理解和操作。...

Global site tag (gtag.js) - Google Analytics