Ответ 1
Вы можете использовать другой файл DEX. Вот как вы это делаете:
http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html
Моя команда и я унаследовали большой проект 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
Да, архитектура приложения, вероятно, должна быть реструктурирована, но это займет время. И пока мы пытаемся найти решение для решения этой проблемы временно.
Любые предложения?
Вы можете использовать другой файл 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/).
Квадрат имел похожие проблемы, и они построили 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 реализации, т.е.
есть другие, перечисленные в Сторонние дополнения. Если они не использовались ни в одном из них, но они кажутся меньше и не имеют всех методов, создаваемых стандартными буферами протокола.
Недавно мы добавили Nano Protobufs в Android, что значительно уменьшает количество генерируемых методов.
Если вы используете eclipse, это самая простая работа вокруг Нажмите здесь!