android - DexIndexOverflowException: ¡No se puede combinar el nuevo índice 65772 en una instrucción que no sea jumbo !: ¿Modo jumbo? y/o Multi-Dex? ¿Qué hay detrás de la escena?
mode multidex (1)
He intentado configurar jumboMode en gradle para mi proyecto, parece ser capaz de resolver la siguiente excepción DexIndexOverflowException:
com.android.dex.DexException: ¡No se puede combinar el nuevo índice 65536 en una instrucción que no sea jumbo!
DexIndexOverflowException: ¡No se puede combinar el nuevo índice 65772 en una instrucción no jumbo!
1) ¿Qué hace la opción jumboMode detrás de la escena?
android {
...
dexOptions {
jumboMode true
}
}
2) También noté que habilitar el multi-dex también puede resolver el mismo problema, ¿cuál es la elección correcta entre estos dos enfoques?
android {
...
defaultConfig {
...
multiDexEnabled true
}
}
"Jumbo" significa "igual que antes, pero con un gran número de referencia".
Casi cualquier cosa en los archivos DEX a los que se hace referencia con valores de 16 bits (incluso el bytecode presente como "unidades" de 16 bits), por lo que aquí es posible tratar solo 65536 objetos (métodos o cadenas), no más.
Pero la aplicación puede contener mucho más cadenas! ¿Cómo resolver este límite? Los desarrolladores de Android acaban de agregar nuevos códigos de operación con el sufijo "jumbo", por lo que puede hacer referencia a la cadena con "const-string 16_bit_addr" o "const-string 32_bit_addr" que puede hacer referencia a 2 ^ 32 elementos. Actualmente el sufijo https://source.android.com/devices/tech/dalvik/dalvik-bytecode "jumbo" solo existe para cadenas (const-string / jumbo), pero en documentos más antiguos contiene:
#
# 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