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

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

相关推荐

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

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

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

    编译Android系统APK 1、设置环境 export ANDROID_HOME=/home/administrator/soft/android export PATH=$PATH:$ANDROID_HOME/out/host/linux-x86/bin export ANDROID_PRODUCT_OUT=$ANDROID_HOME/out/target/product...

    ApkToolkit v3.0

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

    ApkTool V3.0汉化版

    1.将APK放置到APKTool目录下,并改名为123.apk 2.打开APKTool,选择1进行反编译操作完成后会生成一个apk文件夹,大家可以进行改代码、换图标等操作! 3.修改完成后,选择数字3,进行回编译和签名工作,此时生成的apk...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    android apk包大小优化详解

    1.使用开发工具 android studio  Build > Analyz APK 2.文件说明 assets:存放一些配置文件res:资源文件,图片... A:图片压缩大小处理,如果对图片质量没有很大要求 完全可以压缩到几K或者几十K大小,在线压缩处理 

    Delphi XE5 for Android

    5、编译后的apk至少5M以上,按照官方说法是:毕竟要跨平台,体积大很正常。 看来Delphi XE5 支持Android的开发还有一段路要走,等Update吧,先用这个版本熟悉一下。 按照Embarcadero的说法:Windows平台只能使用...

    安卓编译错误原因及处理方法

    1.1(此方法仅解决我的一次问题,是否可靠仍待测试)可能是由build.grade文件下 ` buildscript { repositories { jcenter() google() } }` jcenter()相关文件不能下载引起的,切换为阿里的源之后即可,代码...

    网狐荣耀版开发使用常见问题解答

    二十四、网狐荣耀版系统模块编译出现fatal error c1083:无法打开包含文件“d3d9.h” :no such fil 这个是因为没有把directx sdk添加到项目引用中。加入directx sdk的引用就可以了。Q-Q:457189 二十五、网狐荣耀版...

    TUmine-BaksmaliMiner:可注入任何apk文件monero矿工

    由于dex 64k方法的局限性,它的目标是尽可能地减少方法。 您将收到65%的硬币。 默认情况下,矿工使用设备一半的核心。 产品特点 它仅以一种方法开始。 本机矿工具有防止两次启动的保护。 安装 影片教学 命令备忘...

    custom-class-loader:Dalvik 中的自定义类加载(Android Studio 版本)

    由于 Android Studio Gradle 插件现在提供,有效解决了 Android 65k 方法限制,因此在运行时使用自定义类加载的主要动机现在是可扩展性。 在我的特殊情况下,我正在尝试制作一个。 因此,该版本项目的主要重点是以...

    Spotify-Gender-Ex:一个小工具,可从Android的Spotify应用中删除性别星号(例如艺术家)

    诀窍是apktool可以将反编译的应用程序再次打包到APK文件中。 因此,可以毫无问题地对图像或语言文件进行修改。 因此,您可以反编译原始的Spotify应用程序,打开语言文件(位于res/values-de/strings.xml或plurals....

Global site tag (gtag.js) - Google Analytics