DexIndexOverflowException: 无法将新索引65772合并到非jumbo指令中!:巨型模式?和/或Multi-Dex?背后是什么?

19

我已经尝试在我的项目中使用Gradle设置jumboMode,似乎可以解决以下DexIndexOverflowException:

com.android.dex.DexException: Cannot merge new index 65536 into a non-jumbo instruction!

DexIndexOverflowException: Cannot merge new index 65772 into a non-jumbo instruction!

1) jumboMode选项实际上在幕后做了什么?

android {
    ...
    dexOptions {
        jumboMode true
    }

}

2) 我也注意到启用多 dex 可以解决同样的问题,那么在这两种方法之间应该作出什么选择?

android {
    ...
    defaultConfig {
        ...
        multiDexEnabled true
    }
}

2
一些背景信息在这里:https://dev59.com/gWEi5IYBdhLWcg3wNqLN - fadden
1个回答

3

"Jumbo"的意思是“与之前相同,但具有大量参考数字”。

在DEX文件中,几乎所有内容都使用16位值引用(即使字节码也表示为16位“单元”),因此只能寻址65536个对象(方法或字符串),不能再多了。

但是应用程序可以包含更多的字符串!如何解决这个限制?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),但旧文档中包含:

#
# 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接