Запуск приложений, содержащих большое количество кода

Фон

Кажется, что некоторые старые ОС Android (и, возможно, даже самые новые) имеют ограничение на количество кода, которое может хранить каждое приложение.

Как я уже нашел, ограничение находится в буфере под названием "LinearAlloc".

В 2.2 или 2.3 это примерно 5-8 МБ, и я думаю, что это 16 или больше на других.

Проблема

Если у вас слишком большой код (и приложения могут достичь этого состояния), вы не сможете установить приложение вообще на более старых устройствах, получив следующую ошибку (также сообщите здесь):

Installation error: INSTALL_FAILED_DEXOPT
Please check logcat output for more details.
Launch canceled!

Что я нашел

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

Я нашел следующие ссылки, рассказывающие о том, как Facebook решил это, как-то увеличив предел:

Кроме того, Google опубликовал, как его решить, загружая код динамически:

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

Вопрос

Как сделал Facebook?

Можно ли это преодолеть и другими способами?

Есть ли бесплатная библиотека, которая увеличивает/удаляет ограничение этого буфера?

В чем ограничение на новые версии Android, если есть?

Как справляются с этой проблемой огромные приложения (и игры)? Они помещают свой код в C/С++?

Будет ли загрузка файлов dex динамически решаться?

Ответ 1

Предел - это общее число ссылок на методы:

Среднее расстояние между тем, чтобы ничего не делать и многозадачный подход, описанный в статьях FB/Google, - использовать инструмент, например ProGuard, для удаления ссылок на неиспользуемый код на уровне Java. См:

Ответ 2

Существует новое решение, сделанное Google:

Кажется, все, что вам нужно сделать, это любая из следующих вещей:  - простирается от "MultiDexApplication", а не от "Приложения"  - вызвать MultiDex.install(контекст) в приложении applicationBaseContext

Но теперь я задаюсь вопросом:

  • Это действительно так?
  • Есть ли у вас какие-либо проблемы? Это влияет на производительность?
  • Как это работает?
  • Что нужно делать с ContentProvider, так как он вызывает вызов до того, как приложение будет инициализировано?
  • Сообщение гласит: "дает вам поддержку MultiDex на всех устройствах API 4+ (ну, пока v21, где вы получите это изначально)". Означает ли это, что из v21 это будет поведение по умолчанию, или просто, что класс будет построен, и вам не нужно будет использовать класс библиотеки поддержки?
  • Будет ли это решение работать и на Eclipse?