Intereting Posts
Как собирать информацию из IntentService и обновлять пользовательский интерфейс Android «Файлы« Gradle »изменились с момента последней синхронизации проекта.» Всегда отображается сообщение Выделите искомый текст в элементах ListView Аутентификация веб-API ASP.NET NullPointerException: попытка вызвать виртуальный метод «boolean java.lang.String.equalsIgnoreCase (java.lang.String)» в ссылке на нулевой объект Как вызвать вкладку Onclick и OnTabChange для одной вкладки Как отменить HTTP-запрос на Android? Android java.lang.IllegalMonitorStateException: объект не заблокирован потоком перед ожиданием () Ошибка: не удалось загрузить android-info.txt Попытка повторного открытия уже закрытого объекта: SQLiteDatabase: Android imageview.setBackgroundResource () не работает Как создавать всплывающие уведомления, такие как уведомление, используемое в whatsapp для Android? Получение данных с веб-сайта в приложении для Android START_STICKY, планшет Android отключен без предупреждения Тестирование шоу с закусками с эспрессо

Dexopt потерпел неудачу на очень большом APK (Out-of-order method_idx), когда dex.force.jumbo = true

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

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

Воспользовавшись инструментами 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): Внеуровневый метод_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, приостановили 7ms + 135ms
11-18 20: 11: 09.068: D / AndroidRuntime (780): выключение виртуальной машины

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

Solutions Collecting From Web of "Dexopt потерпел неудачу на очень большом APK (Out-of-order method_idx), когда dex.force.jumbo = true"

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

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

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

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

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