Intereting Posts
IN XMPP, получающее исключение, не авторизованное (401), при отправке формы Большие промежутки между элементами RecyclerView при прокрутке вниз Android HTTP Connection отказано SurfaceCreated: java.lang.NullPointerException Android EPSON therm Печать данных с веб-просмотра при нажатии? Если принтер не найден? Почему Android использует JUnit над TestNG, даже если Cedric Beust создал TestNg и был частью команды Android? Google Analytics – исключение NullPointerException в тесте Как завершить все действия в стеке, кроме первого в Android Каков правильный BeaconLayout для оценочных и карданных маяков Получите мой Wi-Fi IP-адрес Android Найдите размеры (высота, ширина) объекта с помощью камеры Android – ручка «Enter» в EditText Изменение размера растрового изображения на фиксированное значение, но без изменения соотношения сторон Сохранение массива байтов с использованием SharedPreferences Как показать диалог настройки местоположения в android?

Как решить проблему с ограничением компилятора Dalvik по методам 64K?

Моя команда и я унаследовали большой проект Android от другой команды. Сообщается, что все приложение со всеми включенными библиотеками имеет около 35000 методов. Теперь у нас есть задача внедрить новую службу в приложение, где нам нужно использовать буферы протокола.

Проблема в том, что сгенерированный файл .jar со всеми необходимыми .proto-файлами создает еще пару из 35000 методов, это 70000 методов. И если вы не знаете, компилятор Android имеет ограничение 65536 методов на .dex-файл. Мы явно над этим пределом, и мы получаем следующую ошибку, пытающуюся скомпилировать приложение:

Unable to execute dex: method ID not in [0, 0xffff]: 65536 Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536 

Да, архитектура приложения, вероятно, должна быть реструктурирована, но на это потребуется время. И пока мы пытаемся найти решение для решения этой проблемы временно.

Какие-либо предложения?

Solutions Collecting From Web of "Как решить проблему с ограничением компилятора Dalvik по методам 64K?"

Вы можете использовать другой файл DEX. Вот как вы это делаете:

http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html

Включите Proguard ( http://developer.android.com/tools/help/proguard.html ), чтобы удалить неиспользуемые методы. Генератор протобуфа создает тысячи методов, которые никогда не используются.

Также могут быть полезны микропробоубофферы ( https://code.google.com/p/micro-protobuf/ ).

У Square были аналогичные проблемы, и они построили Wire для борьбы с взрывом метода, вызванным protobufs. Они утверждают, что убили 10 000 методов.

В версиях сервисов Google Play до 6.5 вам пришлось собрать весь пакет API в ваше приложение. В некоторых случаях это затрудняло сохранение количества методов в вашем приложении (включая интерфейсные API, библиотечные методы и собственный код) в соответствии с лимитом 65 536.

Начиная с версии 6.5, вы можете выборочно компилировать API-интерфейс сервисов Google Play в свое приложение. Например, чтобы включить только API Google Fit и Android Wear, замените следующую строку в файле build.gradle:

 compile 'com.google.android.gms:play-services:6.5.87' 

С этими строками:

 compile 'com.google.android.gms:play-services-fitness:6.5.87' compile 'com.google.android.gms:play-services-wearable:6.5.87' 

Для получения дополнительной информации вы можете нажать здесь

Если это первое использование буферов протокола, вы можете посмотреть альтернативные реализации JavaME, т.е.

  • Protobuf-JavaME
  • Protobuf-j2me

Есть другие, перечисленные в сторонних дополнениях . Если они не использовались ни в одном из них, но они кажутся меньше и не имеют всех методов, создаваемых стандартными буферами протокола.

Недавно мы добавили Nano Protobufs для Android, что значительно уменьшает количество генерируемых методов.

Если вы используете eclipse, это самая простая работа вокруг Click Here!