Intereting Posts
Android, как проверить, работает ли служба намерений или перестала работать Индикатор мобильной активности jQuery не отображается в android Случайные атаки приложений на Android Wear 5.0.X Какова наилучшая первичная ключевая стратегия для онлайн-офлайнового многопользовательского мобильного приложения с базами данных SQLite и Azure SQL в качестве центрального магазина? Android: высота макета в процентах от разрешения экрана Android Gradle build с субпроектами Могу ли я запретить телефону спать на веб-странице? Как объединить два mp3-файла в один (объединение / объединение) Не удалось возобновить ошибку Действия API Google Диска \ Документы для Android Java – java.lang.IllegalStateException: Не удалось прочитать строку 0, col -1 из CursorWindow Задача RxJava Async в Android Android Eclipse: какой самый простой способ дублировать класс? Преобразование приложений iPhone / iPad на Android Как добавить дополнительный элемент в список без обновления предыдущего элемента

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

Задний план

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

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

Solutions Collecting From Web of "Запуск приложений, содержащих большой объем кода"

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

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

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

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

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

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