一、问题产生原因
报错信息:
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这个问题。
二、解决方案
实现方法:
将项目中不重要的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包
其中project标签里的'basedir'属性填写jar包所在的文件夹路径(路径随意);
jar标签里的'destfile'为合并后的名字(名字随意);
zipfileset标签里的'src'为要合并的jar包名字;
注意不要把APP启动时加载的jar包进行合并,不然可能导致找不到类错误
<?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包
024.然后到安卓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文件
045.将classes2.dex文件放在项目的src根目录下
056.导入multidex库到项目中 (点击链接下载)
067.在项目的BaseApplication类里重写attachBaseContext方法,执行分包
078.在Java Build Path里将合成过的包对勾取消掉,因为这些包已经在classes2.dex存在,无需再次打包进dex
089.编译运行程序,解压apk文件,可以看到已被分成了两个dex
09END
网友评论