Eclipse dex 65536 问题解决方案

一、问题产生原因

报错信息:

Unable to execute dex: method ID not in[0, 0xffff]: 65536

产生原因:

早期的Dalvik VM内部使用short类型变量来标识方法的id,最大值限制在65536,故单个dex文件内的方法数目限制不能超过65536个,当项目中包含太多的方法或引用了过多的第三方jar包时,就容易发生方法数目超过65536,此时编译APK时就会发生Unable to execute dex这个问题。

二、解决方案

实现方法:

1
2
3
将项目中不重要的jar包集中用ant打包成一个jar包,然后再用SDK下build-tools目录里的

dx.bat将这个jar包编译为classes2.dex文件,在APP启动后动态加载这个分包dex。

1.下载Ant工具 apache-ant-1.10.3-bin.zip

    配置系统环境变量,ANT_HOME : D:\soft\apache-ant-1.10.3(根据自己目录),Path : ;%ANT_HOME%\bin;

2.创建build.xml配置文件,此文件用于ant合并jar包

1
2
3
4
5
6
7
其中project标签里的'basedir'属性填写jar包所在的文件夹路径(路径随意);

jar标签里的'destfile'为合并后的名字(名字随意);

zipfileset标签里的'src'为要合并的jar包名字;

注意不要把APP启动时加载的jar包进行合并,不然可能导致找不到类错误
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<project name="con" basedir="D:\workspace\MyProject\libs" default="makeSuperJar">
<target name="makeSuperJar" description="description">
<jar destfile="all.jar">
<zipfileset src="gson-2.0.jar"/>
<zipfileset src="zxing.jar"/>
<zipfileset src="nineoldandroids-2.4.0.jar"/>
<zipfileset src="universal-image-loader-1.9.3.jar"/>

</jar>
</target>
</project>

3.执行命令: ant -buildfile D:\workspace\MyProject\libs\build.xml

执行成功后会生成合并后的all.jar包

4.然后到安卓SDK build-tool目录里使用dx.bat将合成的all.jar包编译成classes2.dex文件,执行命令:

dx --dex --output=D:\workspace\MyProject\libs\classes2.dex D:\workspace\MyProject\libs\all.jar

执行成功后会在libs目录下生成classes2.dex文件

5.将classes2.dex文件放在项目的src根目录下

6.导入multidex库到项目中 (点击链接下载)

7.在项目的BaseApplication类里重写attachBaseContext方法,执行分包

8.在Java Build Path里将合成过的包对勾取消掉,因为这些包已经在classes2.dex存在,无需再次打包进dex

9.编译运行程序,解压apk文件,可以看到已被分成了两个dex

-------------本文结束谢谢阅读-------------