在Android項(xiàng)目中引入過多的jar會(huì)出現(xiàn)錯(cuò)誤:
android.dex.DexIndexOverflowException: Cannot merge new index xxxx into a non-jumbo instruction!
這個(gè)錯(cuò)誤出現(xiàn)的原因是 Android設(shè)定的方法數(shù)是65536個(gè)(DEX 64K problem)涯呻,超過這個(gè)方法數(shù)黍翎,導(dǎo)致dex無法生成面徽,就無法生成APK.
限制原因:早期的Dalvik VM內(nèi)部使用short類型變量來標(biāo)識(shí)方法的id,就有了 最大方法數(shù)的限制65536。
解決方法:
刪除不用的方法趟紊,刪除不使用的jar
項(xiàng)目維護(hù)時(shí)間長了氮双,里面會(huì)出現(xiàn)不再使用的類和不再使用的方法,建議集中清理下霎匈,把不再使用的方法戴差,不再使用的類都清除,這樣的好處是代碼也干凈了铛嘱,如果方法數(shù)超出的不是太多的話通過清理就可以讓方法數(shù)減少到65536以下暖释,一般來說jar里面的方法數(shù)最好,清除一兩個(gè)無用的jar包就能大大的減少方法數(shù)墨吓。分包
通過在defaultConfig中設(shè)置multiDexEnabled可以開啟分包模式饭入,分包之后的Dex就低于了限制數(shù),保證了正常的打包肛真。
defaultConfig {
multiDexEnabled=true
}
- 忽略方法數(shù)限制的檢查
android.dexOptions {
jumboMode = true
}
設(shè)置dexOptions的,不做方法數(shù)限制的檢查爽航,這樣做的缺點(diǎn)是apk無法再低版本的設(shè)備上面安裝蚓让,會(huì)出現(xiàn)錯(cuò)誤:
INSTALL_FAILED_DEXOPT
關(guān)于dexoptions
和jumboMode
在stackoverflow中有一段解釋,我翻譯一下:
In the standard java world:
When you compile standard java code : the compiler produce
*.class
file. A*.class
file contains standard java bytecode that can be executed on a standard JVM.在標(biāo)準(zhǔn)Java的世界
當(dāng)你編譯java代碼時(shí)讥珍,編譯器生成.class
文件历极。.class
文件包含了java的字節(jié)碼。這些字節(jié)碼在JVM中執(zhí)行衷佃。
In the Android world:
- It is different. You use the java language to write your code, but the compiler don't produce
*.class
files, it produce*.dex
file. A*.dex
file contains bytecode that can be executed on the Android Virtual Machine (dalvik) and this is not a standard Java Virtual Machine.
To be clear: a dex file in android is the equivalent of class in standard java.
Sodexoptions
is a gradle object where some options to configure this java-code-to-android-bytecode transformation are defined. The options configured via this object are :- targetAPILevel
- force-jumbo mode (when enabled it allows a larger number of strings in the dex files)
在安卓的世界則不同:
- 你用java語音寫安卓的代碼趟卸,但是編譯器生成的是
.dex
文件,不是.java
文件氏义。.dex
文件包含了在Android虛擬機(jī)中可以執(zhí)行的字節(jié)碼锄列,而不是JVM。所以.dex
文件的作用和標(biāo)準(zhǔn)Java中的.class文件差不多惯悠。
dexoptions
是一個(gè)gradle對(duì)象邻邮,這個(gè)對(duì)象用來設(shè)置從java代碼向.dex文件轉(zhuǎn)化的過程中的一些配置選項(xiàng)。其中一個(gè)就是force-jumbo mode克婶。force-jumbo mode允許你創(chuàng)建更大的.dex
文件筒严。
參考資料: