iOS медленный запуск

У меня есть проект в Swift, и когда я измеряю с помощью DYLD_PRINT_STATISTICS, я вижу 1,0 секунды перед инициализацией, где 70% - это связывание динамических библиотек.

Есть ли чистые и безопасные способы решения этой проблемы?


person Roma    schedule 29.07.2017    source источник
comment
Cocoapods, я думаю, вы используете это?   -  person J. Doe    schedule 29.07.2017
comment
Скорее всего это связанные фреймворки. Без более конкретной информации я не могу дать более конкретный ответ. Тем не менее, сессия WWDC 2017 весьма поучительна.   -  person Brandon Bradley    schedule 29.07.2017
comment
@J.Doe какаоподы действительно. но если я добавлю библиотеки вручную, это не решит проблему, потому что динамическое связывание так или иначе будет. Я нашел решение для преобразования всех модулей в статическую библиотеку. Но это не выглядит чистым решением, на мой взгляд   -  person Roma    schedule 29.07.2017
comment
@BrandonBradley спасибо за ссылку, я посмотрю. Какая информация может быть полезна? я предоставлю это   -  person Roma    schedule 29.07.2017
comment
@Roma Мне пришло в голову, что маловероятно, что вы используете бета-версию macOS High Sierra, о которой идет речь (мой плохой). Вместо этого я бы рекомендовал Оптимизация времени запуска приложения с прошлогодней конференции WWDC. Самая полезная часть этого разговора, вероятно, начинается в 27:30. Сеанс проходит через слишком медленное приложение и резко его ускоряет. Что касается специфики, я имел в виду количество библиотек, необработанное время запуска, используется ли ObjC/C++ и есть ли у вас доступ к исходному коду библиотеки.   -  person Brandon Bradley    schedule 29.07.2017
comment
@BrandonBradley спасибо за вторую ссылку. Я понимаю, что моя проблема в cocopods и dylib. Итак, нужно выяснить, как заставить его работать лучше вместе   -  person Roma    schedule 29.07.2017


Ответы (1)


Согласно сессии Apple на WWDC 2016, посвященной оптимизации времени запуска приложения, независимо от их размер, имеющий большое количество динамически подключаемые библиотеки значительно замедляют запуск приложения.

Чтобы исправить это, несколько динамических библиотек можно объединить в одну библиотеку. Если они уже являются статическими библиотеками, то для их объединения можно использовать libtool с помощью команды из этот ТАК ответ. Однако если они не статичны, то для их объединения необходимо иметь доступ к их исходному коду. Если исходный код доступен, то будет достаточно буквального копирования кода из одной библиотеки в другую и использования полученной библиотеки.

Конечно, объединение разрозненных библиотек в одну определенно неудобно с точки зрения разработчика. Чтобы бороться с этим, Xcode позволяет связывать разные библиотеки, когда установлены разные флаги (например, RELEASE и DEBUG), как описано на этом форуме.

По возможности лучше объединять статические библиотеки, так как процесс объединения менее подвержен ошибкам. CocoaPods позволяет пользователям использовать статические библиотеки в своих проектах.

person Brandon Bradley    schedule 29.07.2017
comment
Обратите внимание, что время загрузки было улучшено после них. Задержка загрузки dylibs вместо ссылки на все приложение из вашего appdelegate уменьшает время, необходимое приложению, чтобы стать отзывчивым. - person Jano; 19.02.2018