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

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

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

7 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам