DexIndexOverflowException: Невозможно объединить новый индекс 65772 в инструкцию, отличную от jumbo!: Jumbo Mode? и/или Multi-Dex? Что стоит за сценой?

Я попытался установить jumboMode в gradle для моего проекта, он, похоже, может решить следующее DexIndexOverflowException:

com.android.dex.DexException: Невозможно объединить новый индекс 65536 в инструкцию, отличную от jumbo!

DexIndexOverflowException: не может объединить новый индекс 65772 в инструкцию, отличную от jumbo!

1) Что такое опция jumboMode на самом деле за сценой?

android {
    ...
    dexOptions {
        jumboMode true
    }

}

2) Я также замечаю, что включение multi-dex может решить ту же проблему, какой правильный выбор между этими двумя подходами?

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

Ответ 1

"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