Android-приложение медленное начальное время запуска

После того, как я начал использовать элементы пользовательского интерфейса из библиотеки дизайна поддержки Android, начальное время загрузки приложения стало очень медленным (около 8 секунд!), И я действительно не знаю, почему.

Я запускал отслеживание методов во время большей части запуска (для начала работы с процессором cpu требуется время для студии Android) и нашел, что он тратит 4 секунды: dalvik.system.DexFile.openDexFile , я не уверен, почему это так долго.

Есть идеи? (Я не добавлял никакого кода, так как в моем приложении много кода, и я не знаю, откуда эта проблема …)

Я испытал увеличение скорости при создании приложения-релиза вместо версии отладки, которую я нормально выполнял.

Я не уверен, почему это работает, но я предполагаю, что это должно быть из-за того, как компилятор связывает ext libs с apk. Однажды я увидел интервью с Чет Хаазе, который является одним из разработчиков платформы android ui, который объяснил, как они старались как можно быстрее показать первую активность в приложении, чтобы избежать скучного экрана заставки. Возможно, эта функция как-то включена в процессе сборки релиза.

EDIT: правильный ответ написан ниже @Embydextrous. Это связано с тем, что приложение находится в режиме отладки.

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

В случае нескольких файлов dex. Сначала загружается первичный файл dex (classes.dex), который затем загружает другие файлы dex.

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

Однако в очень больших приложениях, таких как AirBnb, Facebook, твиттер и т. Д., Есть несколько файлов dex. И, следовательно, задержки запуска приложений, которые можно оптимизировать с помощью оптимизаторов dex.

Как следует из названия, openDexFile – это процесс андроида, который загружает метод из файла dex, чем больше и больше файлов, чем больше загрузка.

Поэтому мой ответ на ваш вопрос – это просто уменьшить количество методов, которые у вас есть, и предпочитать ленивую загрузку библиотек вместо их инициализации в приложении

Поэтому вместо инициализации вашего net lib в App.onCreate инициализируйте его по первому запросу, не создавайте свой db до его необходимости.

Также используйте android: windowBackground в своем приложении thame, чтобы показать пользовательский прелоадер вместо whitescreen 🙂

Как лучше видеть количество методов:

В студии Android под плагинами установите «Android Methods Count», это очень простые плагины, и я думаю, что его название подсказывает, что он делает 🙂

Теперь, когда ваше ноу-хау вашего проекта уменьшится, количество библиотек, которые вы используете прямо сейчас, вы можете захотеть использовать gradle-> root-> Tasks-> android-> AndroidDependencies, чтобы узнать, какие дополнительные библиотеки добавлены в ваш проект.

Также не забудьте использовать основные игровые сервисы и только те библиотеки, которые вы фактически используете.