Подтвердить что ты не робот

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

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

Любые предложения?

4b9b3361

Ответ 3

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

Ответ 4

В версиях сервисов 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'

для дополнительной справки, вы можете нажать здесь

Ответ 5

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

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

Ответ 6

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

Ответ 7

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