Site icon AppTractor

Как Xcode 14 непреднамеренно увеличивает размер приложения

Переход на Xcode 14

Xcode 14, выпущенный 12 сентября, содержит множество новых функций и улучшений. «Первое, что вы заметите», это то, что Xcode стал быстрее и на 30% меньше. Повышенный параллелизм ускоряет создание проектов на 25%, а длительные тесты — на 30%.

Вскоре после выпуска Xcode 14 размер ряда приложений для iOS значительно увеличился. Сначала мы написали в Твиттере о том, что наблюдаем большой рост размера в приложении Zillow для iOS. Но Zillow не стал отдельным примером.

С середины сентября по начало октября:

В каждом случае скачок размера связан с тем, что эти приложения впервые выпускались с Xcode 14. Среди других функций Xcode 14 по умолчанию отключил биткод:

Xcode больше не создает bitcode по умолчанию… Возможность сборки с биткодом будет удалена в будущем выпуске Xcode. IPA, содержащие биткод, должны удалять его перед отправкой в ​​​​App Store — примечания к выпуску Xcode 14

Что такое биткод?

Биткод (bitcode) — это альтернативный способ упаковки приложения, при котором часть процесса сборки остается на стороне Apple после его отправки в App Store. Одна из вещей, которые делает Apple, — это удаление двоичных символов (binary symbols).

Удаление двоичных символов — это удаление из двоичного файла определенных типов метаданных, которые не нужны для запуска приложения в рабочей среде. Это метаданные, которые могут быть полезны перед выпуском приложения, например, для создания файлов dSYM, но они только пожирают место на телефоне пользователя в производственной сборке.

Простое объяснение заключается в том, что битовый код оптимизирует производственные сборки, частично за счет удаления двоичных символов. Без включения битового кода настройки сборки Xcode необходимо изменить, чтобы удалять двоичные символы.

Эта статья не о том, является ли отказ от биткода хорошим или плохим, а о менее известном эффекте выпуска приложений с Xcode 14. Ниже мы:

Сравнение Nike до и после Xcode 14

С Xcode 14 любое приложение, которое полагалось на bitcode , больше не обязательно удаляет двоичные символы из своего производственного приложения. Это означает, что приложение может стать намного больше даже без добавления какой-либо функциональности.

Вот анализ Emerge размера для версии 22.35.0 (измерено 8 октября) приложения Nike для iOS. В этой версии фреймворки занимают 163.7 МБ из всего установочного размера 191.7 МБ.

В версии 22.36.1 (15 октября) фреймворки увеличились до 293.8 МБ (+127.3 МБ) из 322.1 МБ. Обратите внимание на добавление темно-синих «String Table(s)», которые можно найти в каждом фреймворке.

Когда мы сравниваем две сборки, мы видим, что практически все увеличение на 130 МБ связано с увеличением таблиц DYLD.String. Эти таблицы строк — это ненужные метаданные, которые теперь используются в проде.

Nike увеличил объем двоичных символов с 213.9 КБ (0.11% от общего размера приложения) до 127.5 МБ двоичных символов — это почти 40% всего приложения.

В целом приложение Nike для iOS увеличилось на 130 МБ без каких-либо серьезных изменений.

Сколько приложений затронуто

Emerge Tools регулярно загружает приложения из App Store для анализа, что позволяет нам обнаруживать эти регрессии и более внимательно изучать их. Приведенные ниже данные представляют все приложения, в которых:

App Install Size Symbol Size Install Diff Symbol Diff
Nike 323.0 MB 128.6 MB +130.4 MB +127.3 MB
American 407.8 MB 121.8 MB +206.9 MB +76.2 MB
Chime 229.4 MB 90.7 MB +49.9 MB +47.0 MB
Zillow 204.6 MB 49.9 MB +31.8 MB +46.4 MB
BeReal 96.7 MB 39.4 MB +41.7 MB +39.2 MB
Robinhood 309.8 MB 25.1 MB +39.1 MB +24.5 MB
Lucid 222.5 MB 11.8 MB +15.1 MB +24.0 MB
MyFitnessPal 134.7 MB 17.4 MB +15.5 MB +16.3 MB
Fonts Art 254.2 MB 22.5 MB +39.5 MB +12.9 MB
OfferUp 94.0 MB 10.9 MB +11.9 MB +10.8 MB
Peloton 204.9 MB 12.8 MB +27.2 MB +8.5 MB
VPN – Super Unlimited Proxy 74.9 MB 9.9 MB +23.7 MB +7.8 MB
Hinge 69.7 MB 7.4 MB +10.2 MB +5.7 MB
Musi 39.9 MB 3.2 MB +5.7 MB +3.2 MB
Duo Mobile 24.7 MB 3.4 MB +4.4 MB +3.3 MB
Widgetsmith 40.0 MB 3.3 MB +6.5 MB +2.7 MB
Shazam 34.1 MB 2.2 MB +3.6 MB +2.1 MB

Каждое из вышеперечисленных приложений, вероятно, регрессировало из-за выпуска с Xcode 14. Тем не менее, есть много других приложений, которые имеют значительную экономию за счет удаления двоичных символов, что определенно не связано с Xcode 14.

Toyota (v2.0.9), приложение, о котором говорилось в в начале статьи, имеет установочный размер 550.2 МБ и может сэкономить 109.8 МБ (20% от общего размера приложения) за счет удаления двоичных символов. Это был первый раз, когда Emerge Tools проанализировали приложение Toyota, и мы не можем сказать, был ли в нем рост двоичных символов в предыдущих сборках.

Есть также такие приложения, как TurboTax, которые мы анализируем еженедельно с апреля 2022 года. TurboTax может потенциально сэкономить более 100 МБ в каждой измеренной нами сборке. Три основных приложения Intuit для iOS — TurboTax, Mint и Quickbooks — имеют общий установочный размер 1.37 ГБ. Они могут сэкономить 578 МБ (42% размера), просто удалив двоичные символы.

Ниже приведен список приложений, в которых более 15 МБ двоичных символов, но мы не можем точно сказать, связано ли это с переходом на Xcode 14.

App Install Size Symbol Size
QuickBooks 605.9 MB 246.4 MB
Mint 436.0 MB 200.1 MB
TurboTax 347.6 MB 132.2 MB
Google Earth 262.3 MB 113.3 MB
Toyota 550.2 MB 109.8 MB
Fidelity 318.9 MB 102.8 MB
Xfinity 288.2 MB 102.7 MB
iRobot 533.5 MB 94.2 MB
Skyscanner 209.5 MB 91.4 MB
Amazon Alexa 378.6 MB 87.3 MB
Prime Video 208.0 MB 82.7 MB
Premiere Rush 449.7 MB 78.8 MB
Nike Run Club 308.3 MB 78.0 MB
Bleacher Report 286.9 MB 75.7 MB
Citi Mobile 313.9 MB 73.6 MB
Amazon Music 256.3 MB 64.4 MB
Glovo 195.7 MB 55.7 MB
BofA 393.3 MB 53.7 MB
Turo 197.3 MB 51.4 MB
SoundCloud 156.1 MB 51.0 MB
Chargemap 137.5 MB 44.1 MB
Taco Bell 209.7 MB 43.6 MB
Wendy’s 182.8 MB 38.5 MB
Klarna 226.2 MB 37.5 MB
MasterClass 128.7 MB 37.2 MB
AllTrails 205.8 MB 36.1 MB
Twitch 150.0 MB 33.1 MB
GroupMe 97.9 MB 31.2 MB
Chrome 177.7 MB 30.0 MB
Twitter 256.5 MB 27.4 MB
Spendesk 121.0 MB 26.1 MB
Yelp 244.3 MB 25.5 MB
Authenticator 143.0 MB 23.0 MB
Bloomberg 138.1 MB 22.0 MB
Bible 133.0 MB 21.9 MB
Domino’s 140.5 MB 19.1 MB
Proton VPN 115.8 MB 19.5 MB
Fly Delta 172.0 MB 18.0 MB
DraftKings 149.2 MB 17.5 MB
Fantasy 124.1 MB 17.8 MB
Panda Express 116.9 MB 16.1 MB
ESPN 119.0 MB 15.6 MB
JetBlue 112.0 MB 15.8 MB
Zelle 66.9 MB 15.8 MB

Как удалить двоичные символы без биткода

К счастью, удалить двоичные символы из конечной сборки несложно. Вот два способа удаления двоичных символов.

Используя настройки сборки Xcode

Вы можете автоматически удалять символы из билда во время Архивирования сборки, установив:

Однако с этим методом вы должны быть осторожны, чтобы настройки были одинаковыми для всех таргетов. Кроме того, могут быть подводные камни при использовании менеджеров пакетов. Для Cocoapods здесь обсуждается проблема, которая связана с одним из возможных решений (убедитесь, что все обрезаемые фреймворки являются динамическими, если вы делаете это).

Используя скрипт

Вы также можете запустить приведенный ниже скрипт в самом конце процесса сборки, прямо перед подписанием. Обратите внимание, что для некоторых менеджеров пакетов, таких как Cocoapods, может не быть никакой точки между копированием фреймворков и подписанием, где можно запустить пользовательский скрипт. В этом случае подпись необходимо будет снова выполнить вручную после удаления, потому что удаление сделает подпись недействительной.

Ниже приведен пример сценария, который вы можете использовать для удаления двоичных файлов. Огромное спасибо Филипу Бусику из Doordash за помощь!

В настройках этапов сборки убедитесь, что флажок «На основе анализа зависимостей» не установлен, чтобы скрипт запускался при каждой сборке. Подробнее об этом методе можно прочитать в нашей документации.

Примечание: удаление двоичных символов необходимо выполнить перед подписью приложения, иначе подпись кода будет признана недействительной.

Почему это важно

Как Apple сказала в своем видео про Xcode 14, размер приложения — это первое, что заметит ваш пользователь. И пользователи обращают на это внимание, как выразился недавний обозреватель iOS-приложения American Airlines:

В документации Google Play Console есть аналогичная рекомендация:

Размер приложения — один из важнейших факторов, влияющих на показатели установки и удаления вашего приложения. Важно регулярно отслеживать и понимать, как вы можете уменьшить размер загрузки и установки вашего приложения.

Хорошо… размер имеет значение… Если предположить, что это правда, как можно было бы избежать этой регрессии?

Нереально ожидать, что разработчики будут в курсе всех нюансов изменений версии платформы. Именно здесь вступает в действие непрерывный мониторинг. Если измерения выполняются вручную, регрессии не будут постоянно обнаруживаться до того, как они попадут в рабочую среду.

Выше приведено сообщение Slack от одного из наших клиентов, который спрашивает об увеличении размера своего приложения после перехода на Xcode 14. Они поймали регрессию перед выпуском с помощью инструментов непрерывной интеграции Emerge.

Устаревание битового кода, которое произошло в Xcode 14, безусловно, является крайним примером регрессии размера приложения. Однако мы обнаруживаем, что небольшие регрессии происходят все время, будь то обновление SDK или новая функция. Со временем эти изменения накапливаются и приводят к заметному ухудшению пользовательского опыта, что является еще одной причиной для того, чтобы заранее задуматься о размере вашего приложения.

Источник

Exit mobile version