Запуск приложений, содержащих большое количество кода
Фон
Кажется, что некоторые старые ОС 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?