Большие компании всегда найдут показатели, которые можно улучшить и заработать больше денег. Многие такие улучшения происходят в пользовательском опыте, например, мобильного приложения.
Пользовательский опыт это очень обширная тема, можно говорить о создании потрясающих анимаций; уменьшении количества нажатий на кнопку, для достижения цели; покраске, этих самых, кнопок и еще много о чем.
Есть один аспект пользовательского опыта, от предвкушения работы над которым у разработчиков загораются глаза, и руки сами тянутся к клавиатуре.
Этот аспект – скорость. А точнее, оптимизация выполнения программы. Тут можно говорить о чем угодно, от уменьшения количества циклов в отдельном куске кода, до ускорения выполнения отдельных операций.
«А есть ли во всем этом какой-то реальный профит для компании, кроме радости разработчиков интересной задаче?», – спросите вы. Давайте разбираться.
Представьте, что вы работаете в молодой компании, у которой дела идут в гору. Вы решаете расширяться, нанимать больше сотрудников, добавлять функциональности вашему продукту.
Со временем, если вы не подготовились к этому заранее, а скорее всего так и есть, вы сталкиваетесь с двумя проблемами.
С каждым днем, ваш перерыв на кофе с пончиком занимает все больше времени, но когда вы возвращаетесь на рабочее место, сборка проекта еще не завершена.
Ваши пользователи начинают жаловаться на количество времени, которое они проводят на сплеш-скрине, с каждым днем, жалобы все серьезнее и серьезнее.
Как вы поняли, сегодня мы говорим о второй проблеме – скорость запуска iOS приложения.
Существует огромное количество причин, почему приложение начинает зависать на старте. Это может быть связано с выполнением запросов на сервер, инициализацией тяжелых компонент, чтением из базы и тд.
В большинстве случаев, разработчики вашей молодой компании, побороли все очевидные причины зависания приложения, потому, вам придется смотреть в чем еще может быть проблема.
Начните с анализа количества зависимостей вашего проекта. В наше время так просто добавить какую-нибудь стороннюю библиотеку, их сотни тысяч и они делают все что вам может потребоваться.
Помимо сторонних зависимостей, вы могли уже пытаться справиться с первой проблемой, укоротив время инкрементальной сборки разбитием вашего кода на модули.
Оба типа зависимостей, что внешние, что внутренние, должны каким-то образом быть представлены в финальном бандле приложения, установленном на устройстве пользователя.
Существует 2 основных типа указания таких зависимостей, а точнее, 2 типа связки зависимостей с кодом вашего приложения: статическая и динамическая.
Динамическая связка используется по-умолчанию, в большинстве случаев. Именно динамически-связанный фреймворк производит ваш Xcode, при попытке создания таргета Framework для проекта.
Зависимости, связанные динамически, дают на выходе отдельно-стоящие MACH-O файлы, которые затем копируются в бандл вашего приложения в директорию “Frameworks”.
Эти фреймворки находятся вашим приложением через решение рантайм пути поиска или @rpath. Преимуществом динамической связки является возможность переиспользования зависимостей между исполняемыми файлами.
За поиск и связку таких зависимостей отвечает специальная утилита dylib. В момент старта вашего приложения, dylib начинает поиск и загрузку ваших динамических зависимостей в память.
В случае, если не удалось найти зависимость, dylib даст об этом знать прекратив выполнение вашего приложения при старте.
Со статической связкой все происходит немного иначе. Статические библиотеки не копируются рядом с исполняемым файлом приложения. Вместо этого, символы ваших статических зависимостей сливаются в одно целое со своим спутником, то есть с исполняемым файлом приложения.
В отличии от динамической, статическая связка не дожидается рантайма и происходит в момент сборки проекта, таким образом, у вас не будет неприятного сюрприза в виде завершения работы при старте, из-за недостающей зависимости.
Такой неполноценный проект просто не соберется, а соответственно и не попадет к пользователю. Такую гарантию качества вам предоставит утилита Ld, отвечающая за линовку символов.
Теперь, поскольку мы немного разобрались в разнице между типами связываний, давайте подумаем почему наше приложение может тормозить при старте и на что фактически уходит это время. Для того чтобы это понять, нам необходимо разобраться в том, как работает динамическое связывание.
Продолжение:
twitter.com/mobileunderhoo…