Как решить проблему с ограничением компилятора 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!