Ошибка Dexopt на очень большом APK (неверный метод method_idx), когда dex.force.jumbo=true

У меня есть очень большой проект Android с несколькими большими сторонними jar-файлами (в виде библиотек Android).
Я считаю, что достиг максимального количества методов Dex (компиляция через eclipse):

[2012-11-18 02:28:45 - Найти в файлах] Dx-обработка class.dex...
[2012-11-18 02:28:48 - Dex Loader] Невозможно выполнить dex: невозможно объединить новый индекс 66774 в инструкцию без больших размеров!
[2012-11-18 02:28:48 - Найти в файлах] Ошибка преобразования в формат Dalvik: невозможно выполнить dex: невозможно объединить новый индекс 66774 в инструкцию без больших размеров !

Воспользовавшись инструментами SDK 21 (инструменты платформы 16), я отредактировал свой основной проект project.properties, установив dex.force.jumbo=true.
Этот флаг позволил мне сгенерировать APK. Но я не мог установить его правильно (как на физическом, так и на эмуляторе). Кажется, произошел сбой оптимизатора dex:

11–18 20:11:05.338: I/PackageManager(103): Запуск dexopt: com.mypackage.myapp
11–18 20:11:08.577: E/dalvikvm(868): Неверный метод method_idx : 0x2ae0, затем 0x1
11–18 20:11:08.577: E/dalvikvm(868): Проблема с элементом 1544 @ offset 0xf7ae24
11–18 20:11:08.577: E/dalvikvm(868): Обмен секции типа 2006 не удалось
11–18 20:11:08.577: E/dalvikvm(868): ОШИБКА: обмен байтами + проверка не удалась
11–18 20:11:08.597: E/dalvikvm(868): Ошибка оптимизации
11-18 20:11:08.597: W/installd(39): DexInv: --- END '/data/app/com.mypackage.myapp-1.apk' --- status=0xff00, процесс не выполнен
11-18 20:11:08.597: E/installd(39): ошибка dexopt в '/data/dalvik-cache/data@[email protected]@classes.dex' res = 65280
11-18 20:11:08.697: W/PackageManager(103): Не удалось установить пакет в /data/app/com.mypackage.myapp-1.apk
11-18 20 :11:09.018: D/dalvikvm(103): GC_EXPLICIT освободил 1698K, 13% освободил 17034K/19463K, приостановил 7ms+135ms
11-18 20:11:09.068: D/AndroidRunt ime(780): выключение виртуальной машины

Пытаюсь ли я использовать флаг dex.force.jumbo не по назначению, или эта ошибка непредсказуема?
Если да, то есть ли лучшая стратегия для создания проекта, включающего очень большое количество классов/методов?


person Gili Nachum    schedule 25.11.2012    source источник
comment
из документов dex.force.jumbo используется только для разрешения большего количества строк   -  person nandeesh    schedule 28.01.2013


Ответы (2)


Ограничение в 64 КБ методов является ограничением формата Dex (он использует 2 байта для поиска метода).
В комментарии Nandeesh указано, что jumbo решает только строки, а не методы.

Альтернативы, которые я пробовал/рассматривал (приготовьтесь, все они отстой):
1. Сделай сам — выброси самые толстые сторонние библиотеки и напиши точные части его функциональность самостоятельно. В итоге я выбрал именно этот подход, так как понял, что добавляю много кода для небольшого функционала.
2. Пользовательская загрузка классов в Dalvik — скомпилируйте отдельный Dex и загрузите его во время выполнения. Минусы: громоздко, требует размышлений.
3. Сокращение кода. Включите подробную загрузку классов, запустите приложение и попытайтесь удалить сторонние библиотеки или части библиотеки, которые на самом деле не используются. Минусы: трудоемкость, подверженность ошибкам, так как классы загружаются динамически.
4. Разделяй и соглашайся — упаковывайте сторонние библиотеки в отдельный процесс (службу). Эта служба будет обеспечивать функциональность сторонних библиотек. Выполняйте вызовы этой службы из вашей основной программы.

Я считаю, что этого случая 640 000 должно быть достаточно для всех ИЛИ ни в коем случае не будет этого на каждом втором телефоне на планете со стороны ранней команды разработчиков Dalvik.

Если вы хотите узнать больше или просто кричать о загрузке в Google, я создал этот дефект: http://code.google.com/p/android/issues/detail?id=40409

person Gili Nachum    schedule 27.01.2013

Я столкнулся с той же проблемой. наконец, я обнаружил, что это может быть вызвано несколькими методами с одним и тем же именем, например, doSomething(List list); и делать что-то (список списка); компилятор говорит, что ошибок нет, но не может установить на мое устройство. Поэтому, пожалуйста, проверьте свои методы с тем же именем.

person mariotaku    schedule 25.05.2013