终于我也遇到了方法数超过65535

/ 0评 / 4

前言

今天在愉(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章