前言
Android应用程序,最终发布成一个apk,安装到手机上。 apk文件随便用一个解压缩文件打开,可以看到里面有一个classes.dex文件,这就是之前工程中所有的代码,以及所有依赖的jar包全部合并在一起生成的一个dex文件。关于dex文件是什么,可以自己去科普一下。
google当初在设计dex文件的时候,限制了dex文件中最大的函数个数为65536(unsigned short),如果超出这个限制,那么如果不采用特殊处理,打包的时候,就会抛出:
org.jf.util.ExceptionWithContext: Unsigned short value out of range: *
类似这样的错误**
对于游戏开发来说,我们目前主要的问题是, 一个游戏本身采用的可能是unity或者cocos2dx等游戏引擎开发, 纯粹的Android代码并不多, 但是由于目前手机游戏需要接入很多渠道SDK, 部分渠道SDK的jar包是相当大的,里面对应的函数数量自然也少不了。这就会导致,这些渠道SDK在集成到游戏中,我们再次打包,会出现函数数量越界的问题。
另一个问题,就是我们除了接入渠道SDK之外,往往还需要同时接入统计,分享,推送等其他功能性SDK,所有这些jar包加起来,函数数量越界的可能就更大了。
解决方案
在app–>build.gradle的DexOptions里增加了additionalParameters 参数来配置dx的参数。
我们来试下:
首先在app的build.gradle里的DexOptions里面增加以下内容:
dexOptions {
javaMaxHeapSize "4g"
preDexLibraries = false
additionalParameters = ['--multi-dex',
'--set-max-idx-number=30000']
}
注意:需要升级jdk,把jdk升级到1.8
测试了打出的包,在指定dex内方法数量30000的情况下,打出五个dex,主dex内方法数量为30000