问题描述
我试图在我的项目的gradle中设置jumboMode,看来能够解决以下DexIndexOverflowException:
I have tried to set jumboMode in gradle for my project, it seems able to solve the following DexIndexOverflowException:
DexIndexOverflowException:无法将新索引65772合并为非巨型指令!
DexIndexOverflowException: Cannot merge new index 65772 into a non-jumbo instruction!
1)jumboMode选项在幕后实际上是做什么的?
1) What is jumboMode option actually does behind the scene?
android {
...
dexOptions {
jumboMode true
}
}
2)我还注意到启用多dex也可以解决相同的问题,这两种方法之间的正确选择是什么?
2) I also notice that enabling multi-dex can solve the same problem as well, what is the right choice between these two approaches?
android {
...
defaultConfig {
...
multiDexEnabled true
}
}
推荐答案
巨型"的意思是与以前相同,但有大量参考文献".
"Jumbo" means "same as before, but with large number for reference".
DEX文件中几乎所有带有16位值(甚至字节码以16位单位"表示)的东西,因此这里只能寻址65536个对象(方法或字符串).
Almost anything in DEX-files referenced with 16-bit values (even bytecode present as 16-bit "units"), so here possible to address only 65536 objects (methods or strings), no more.
但是应用程序可以包含更多的字符串!如何解决这个限制?Android开发人员刚刚添加了带有"jumbo"后缀的新操作码,因此您可以使用"const-string 16_bit_addr"或"const-string 32_bit_addr"来引用字符串,它们可以引用2 ^ 32个项目.目前 https://source.android.com/devices/tech/dalvik/dalvik-bytecode "jumbo"后缀仅适用于字符串(const-string/jumbo),但在较旧的文档中包含:
But application can contain much more strings! How to solve this limit? Developers of Android just added new opcodes with "jumbo" suffix, so you can reference string with "const-string 16_bit_addr" or "const-string 32_bit_addr" which can reference 2^32 items. Currently https://source.android.com/devices/tech/dalvik/dalvik-bytecode "jumbo" suffix exists only for strings (const-string/jumbo), but in older docs contain:
#
# Extended-width opcodes
#
op 00ff const-class/jumbo 41c y type-ref continue|throw
op 01ff check-cast/jumbo 41c n type-ref continue|throw
op 02ff instance-of/jumbo 52c y type-ref continue|throw
op 03ff new-instance/jumbo 41c y type-ref continue|throw
op 04ff new-array/jumbo 52c y type-ref continue|throw
op 05ff filled-new-array/jumbo 5rc n type-ref continue|throw
op 06ff iget/jumbo 52c y field-ref continue|throw
op 07ff iget-wide/jumbo 52c y field-ref continue|throw
op 08ff iget-object/jumbo 52c y field-ref continue|throw
op 09ff iget-boolean/jumbo 52c y field-ref continue|throw
op 0aff iget-byte/jumbo 52c y field-ref continue|throw
op 0bff iget-char/jumbo 52c y field-ref continue|throw
op 0cff iget-short/jumbo 52c y field-ref continue|throw
op 0dff iput/jumbo 52c n field-ref continue|throw
op 0eff iput-wide/jumbo 52c n field-ref continue|throw
op 0fff iput-object/jumbo 52c n field-ref continue|throw
op 10ff iput-boolean/jumbo 52c n field-ref continue|throw
op 11ff iput-byte/jumbo 52c n field-ref continue|throw
op 12ff iput-char/jumbo 52c n field-ref continue|throw
op 13ff iput-short/jumbo 52c n field-ref continue|throw
op 14ff sget/jumbo 41c y field-ref continue|throw
op 15ff sget-wide/jumbo 41c y field-ref continue|throw
op 16ff sget-object/jumbo 41c y field-ref continue|throw
op 17ff sget-boolean/jumbo 41c y field-ref continue|throw
op 18ff sget-byte/jumbo 41c y field-ref continue|throw
op 19ff sget-char/jumbo 41c y field-ref continue|throw
op 1aff sget-short/jumbo 41c y field-ref continue|throw
op 1bff sput/jumbo 41c n field-ref continue|throw
op 1cff sput-wide/jumbo 41c n field-ref continue|throw
op 1dff sput-object/jumbo 41c n field-ref continue|throw
op 1eff sput-boolean/jumbo 41c n field-ref continue|throw
op 1fff sput-byte/jumbo 41c n field-ref continue|throw
op 20ff sput-char/jumbo 41c n field-ref continue|throw
op 21ff sput-short/jumbo 41c n field-ref continue|throw
op 22ff invoke-virtual/jumbo 5rc n method-ref continue|throw|invoke
op 23ff invoke-super/jumbo 5rc n method-ref continue|throw|invoke
op 24ff invoke-direct/jumbo 5rc n method-ref continue|throw|invoke
op 25ff invoke-static/jumbo 5rc n method-ref continue|throw|invoke
op 26ff invoke-interface/jumbo 5rc n method-ref continue|throw|invoke
这篇关于DexIndexOverflowException:无法将新索引65772合并到非巨型指令中!:巨型模式?和/或Multi-Dex?幕后是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!