Ошибка Dexopt на очень большом APK (из-за порядка method_idx), когда dex.force.jumbo=true

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

[2012-11-18 02:28:45 - Найти в файлах] Dx-обработка classes.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 optimizer:

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 при смещении 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@app@com.mypackage.myapp-1.apk@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, приостановлено 7 мс +135 мс
11-18 20:11:09.068: D/AndroidRuntime(780): выключение виртуальной машины

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

2 ответа

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

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

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

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

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

Другие вопросы по тегам