一、问题产生原因
报错信息:
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 | 将项目中不重要的jar包集中用ant打包成一个jar包,然后再用SDK下build-tools目录里的 |
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 | 其中project标签里的'basedir'属性填写jar包所在的文件夹路径(路径随意); |
1 | <?xml version="1.0" encoding="utf-8"?> |
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