前言
今天在愉(ku)快(bi)的合并三个项目时候,好不容易解决了所有错误,于是点了下运行,然后编译器报错com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536,看到这里第一反应就是这难不成是传说中的方法数爆炸么?终于有机会来踩坑了。
既然一个dex文件只能放65535个方法,那么解决此问题的方法就是将一些方法打包到另外一个dex中,一般来说为classes2.dex、classes3.dex......
Eclipse下解决65535
由于公司开发环境为Eclipse,所以这里介绍如何在Eclipse下处理此问题,末尾给出Android Studio的解决方法,首先分析出现的原因,一般来说,不太可能是自己写的方法数超过此限制,最有可能的原因是引入的jar包过多,造成此问题,我遇到的情况中,项目里面引入了15+个jar,并且还有几个是大体积的,所以就将jar包全部分包出去。
合并jar包
由于需要打包到classes2.dex中的jar包较多,所以第一步就是将所有的jar包合为一个,这里有两种方法。分别介绍如下
方法一:
使用解压软件将所有的jar包解压到一个文件夹(不用管META-INF文件夹),如下图所示。然后删除所有jar包,在此目录下使用命令jar –cvfM all.jar .,这样就会在当前目录下面生成一个all.jar了,注意命令后面的 . 表示当前目录。
方法二:
使用ant脚本进行合并,关于如何安装ant,可以参考这篇博客,需要注意的是,如果命令行中输入ant出现Unsupported major.minor version 52.0等类似的错误,表示ant版本比Java版本高,你可以尝试在这里下载前的版本,然后使用。当配置好ant以后,就可以编写ant脚本了。
新建一个build.xml,然后内容如下。然后在build.xml所在目录执行ant命令,那么等待一会提示success以后,在jar包所在目录就会生成all.jar了。
<?xml version="1.0" encoding="utf-8"?> <project name="b" basedir="jar包所在目录" default="makeSuperJar"> <target name="makeSuperJar" description="description"> <jar destfile="all.jar"> <zipfileset src="jar包一"/> <zipfileset src="jar包二"/> <zipfileset src="jar包三"/> <zipfileset src="jar包四"/> </jar> </target> </project>
将jar包打包为dex文件
将jar包打包为dex文件需要使用SDK中自带的dx.bat,目录为<SDK>/build-tools/19.1.0/dx.bat,然后在此目录下使用命令dx --dex --output=E:\libs\classes2.dex E:\libs\all.jar即可(蓝色部分请自行替换)
如果遇到脚本执行过程中出现OOM,需要自行修改脚本中的set defaultXmx=-Xmx512M,将其值调整的大一点即可。这样我们就可以得到classes2.dex了。
配置项目环境
将上一步得到的classes2.dex放在src/目录下面,这样打包以后,jar里面的内容也会进入apk,这里有一个需要注意的地方,我们的jar包中的函数全部在classes2.dex中了,那么jar包还需要放在工程中么,其实是需要的,不过不能放在libs目录下,如果放在libs目录下面,打包的时候,jar包还是会被再一次打包到apk中,所以可以新建一个outjars目录,然后将jar包全部放在里面,然后在项目上面右键Properties->Java Build Path->Libraries->Add JARs,选中outjars中的jar包即可,这样就完成配置了。
使用android-support-multidex.jar
android-support-multidex.jar为Google提供的解决方案,jar下载地址jar,将jar放在libs下面,然后使你的Application继承自MultiDexApplication即可
public class MyApplication extends MultiDexApplication { }
如果不想继承MultiDexApplication,那么也可以使用如下写法
public class MyApplication extends Application{ @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
至此,方法数超过65535的问题就被解决了。
Android Studio解决方法数超过65535
如果你是使用的Android Studio,那么恭喜你,处理此问题不需要向上面那样复杂,仅仅两句配置即可。
android{ compileSdaVersion 22 buildToolsVersion "22.0.1" defaultConfig{ ..... multiDexEnabled true } } //添加依赖 dependencies{ compile 'com.android.support:multidex:1.0.0' }
然后参考上面android-support-multidex.jar的使用方法在Application中进行配置即可。顺便贴出官方文档:Google文档
PS:顺便吐槽一句,为毛公司还在用Eclipse。
参考链接
http://www.cnblogs.com/liemng/p/5982221.html
http://blog.csdn.net/xiaoxnn/article/details/54862695
http://www.cnblogs.com/yuzhongwusan/archive/2013/03/26/2982411.html
《Android 开发艺术探索》第13章