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

Фон

Кажется, что некоторые старые ОС 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/C++?

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

2 ответа

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

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

Существует новое решение от Google:

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

Но теперь мне интересно

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