Фон
Кажется, что некоторые старые ОС Android (и, возможно, даже самые новые) имеют ограничение на количество кода, которое может хранить каждое приложение.
Как я уже нашел, ограничение находится в буфере под названием "LinearAlloc".
В 2.2 или 2.3 это примерно 5-8 МБ, и я думаю, что это 16 или больше на других.
Проблема
Если у вас слишком большой код (и приложения могут достичь этого состояния), вы не сможете установить приложение вообще на более старых устройствах, получив следующую ошибку (также сообщите здесь):
Installation error: INSTALL_FAILED_DEXOPT
Please check logcat output for more details.
Launch canceled!
Что я нашел
Одним из решений является просто удалить как можно больше кода и библиотек, но в некоторых крупных проектах это очень сложно сделать.
Я нашел следующие ссылки, рассказывающие о том, как Facebook решил это, как-то увеличив предел:
- http://www.slashgear.com/how-facebook-fixed-its-gingerbread-dalvik-problem-04272478/
- http://arstechnica.com/business/2013/03/how-facebook-dug-deep-within-android-to-fix-its-mobile-app/
- https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920
Кроме того, Google опубликовал, как его решить, загружая код динамически:
http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html
Вопрос
Как сделал Facebook?
Можно ли это преодолеть и другими способами?
Есть ли бесплатная библиотека, которая увеличивает/удаляет ограничение этого буфера?
В чем ограничение на новые версии Android, если есть?
Как справляются с этой проблемой огромные приложения (и игры)? Они помещают свой код в C/С++?
Будет ли загрузка файлов dex динамически решаться?