Этим летом я заметил, что мое приложение набрало вес, но я не был уверен, что вызвало это и как это выяснить.
Поиграв с иконкой одного размера, я познакомился с процессом определения размера приложения и решил копнуть дальше.
Последние результаты на iPhone 14 Pro были такими:
App size: 71,8 MB compressed, 82,4 MB uncompressed
Это много для приложения, которое изначально весило около 8 Мб (если я правильно помню…). С тех пор я добавил много коров, а также два расширения (виджет и уведомления), но все равно это увеличение не показалось мне правильным.
Ассеты являются общими для приложения, виджета и уведомлений, но файл Assets.car дублируется для каждого из них. Таким образом, любой такой файл занимает в приложении iPhone в 3 раза больше места, чем сам файл.
Благодаря моему другу Акселю я научился открывать файлы Assets.car с помощью iOS Images Extractor.
Все мои коровы — это универсальные PDF-файлы, но Xcode генерирует из них 3 PNG. Вот почему некоторые люди перестали использовать PDF-файлы.
Изучив файл Assets.car, я увидел, что самые тяжелые изображения принадлежали этой корове:
В ней много деталей, поэтому, конечно, ее было трудно сжать. Три png-файла (@1x, @2x, @3x) вместе весили 1.2 Мб!
Это связано с тем, что в моем файле Affinity Designer размер монтажной области установлен на 800×600 точек, а это означает, что Xcode сгенерирует @1x с размером 800×600 пикселей. Это излишне, тем более что @3x теперь будет иметь разрешение 2400×1800 пикселей. Это НАМНОГО больше пикселей чем то, что нужно приложению.
Поскольку в Xcode 12 добавлена поддержка файлов SVG, я решил попробовать.
App size: 78,1 MB compressed, 88,9 MB uncompressed
Только версия @3x, сгенерированная Xcode, весила 3.9 Мб.
Затем я попробовал другой подход, который мне предложили — я создал Swift Package «CowsKit» только с этим ассетом.
К сожалению, как и в случае с Assets.car, пакет дублируется во всех таргетах, которым он нужен, как показано на этом изображении моего расширения уведомлений.
Я вернулся к своему файлу и изменил размер Artboard на 400ptx300pt вместо 800ptx600pt.
App size: 70,9 MB compressed, 81,5 MB uncompressed
Это было обнадеживающе. Мне стало любопытно, и я сделал еще одну попытку с разрешением 80ptx60pt.
App size: 70,3 MB compressed, 80,8 MB uncompressed
Это на 1.5 Мб меньше всего с одним файлом. А так как это векторный файл, я могу отобразить корову на весь экран, и качество будет таким же.
Я не мог в это поверить. Я подумал, что:
- Рендеринг будет медленным (проверил — на iPhone 6s масштабирование было незаметным).
- Возможно, было задействовано некоторое кеширование, и каким-то образом сборка все еще использовала старый актив.
Для этого второго пункта я сделал две проверки:
- Экспорт: я заархивировал свою сборку, экспортировал с помощью app thinning и открыл Assets.car, чтобы найти свой файл.
- Я закомментировал код, который изменяет размеры изображений. Вот что убедило меня, что я не сплю. Как вы можете видеть ниже, слева находится PDF-файл с базовым размером 80×60 пикселей, а справа — с размером 800×600 пикселей.
Я знал, что должен сделать, хотя очень не хотел этого делать, потому что это была бы кропотливая работа.
Результат
После нескольких часов повторной обработки изображений мне не терпелось увидеть результат.
App size: 21,2 MB compressed, 32,2 MB uncompressed
С 71.8 Мб до 21.2 Мб для iPhone 14 Pro.
Дополнительно
Я использовал iOS Image Extractor и DaisyDisk для проверки файла Assets.car и обнаружил еще несколько вещей, которые можно было бы улучшить:
- Я преобразовал некоторые файлы из PNG в PDF
- Я попытался быть умным и преобразовал PNG фотографии в JPG… но Xcode все равно сгенерировал PNG, и приложение набрало 2 Мб, поэтому я отменил это
- Я масштабировал иконки социальных сетей (Instagram, Reddit, Twitter…)
- Убрал неиспользуемые ассеты (весили немного, но все равно трата)
- Я исключил «дубликаты» — 5 изображений были включены дважды, потому что была версия с полями и версия без полей…
Это сэкономило мне еще 2 МБ:
App size: 19,3 MB compressed, 30,6 MB uncompressed
Обновление иконок моих приложений для поддержки новых размеров
К этому моменту мои иконки все еще использовали All Sizes (Xcode 13), что означало, что мне не хватало некоторых размеров.
Я воссоздал иконки для моих 99 альтернативных иконок и для основной и создал новый экспорт.
App size: 29,1 MB compressed, 41,2 MB uncompressed
Дополнительные 10 Мб! Это меня удивило, потому что если бы мои недавние злоключения в единой иконкой закончились бы ничем, то общий вес приложения все равно был бы намного меньше.
Я подготовил новый архив:
App size: 22,2 MB compressed, 33,4 MB uncompressed
Оказывается, Single Size Icon не так уж и плох! Единственная причина, по которой мой результат был разочаровывающим, заключается в том, что мое сравнение было несправедливым, поскольку параметр Single Size обрабатывал больше размеров, чем моя существующая конфигурация (All Sizes в Xcode 13).
Сравнение размеров файлов в App Store
Последним шагом для меня было сравнение размеров файлов в App Store Connect.
Вы можете получить к ним доступ на вкладке Testflight:
- Выберите свою сборку
- Нажмите Build Metadata.
- Найдите Compressed File Size и нажмите App Store File Sizes.
Вот скриншоты до/после. Результат чертовски радует.
Вывод
Было больно, но оно того стоило. Размер приложения имеет значение, и я не мог оставить все как есть теперь, когда обнаружил свою ошибку.
По-видимому, правила, по которым нужно жить, таковы:
- Используйте PDF/SVG и установите флажок «Preserve Vector Data».
- Используете JPG? Xcode, похоже, в любом случае генерирует PNG, вам будет лучше, если вы оптимизируете его самостоятельно.
- Если вы используете PDF-файлы (или SVG), убедитесь, что исходный размер подходит и что это не приводит к тому, что Xcode создаст абсурдно большие PNG.
- Xcode оптимизирует (pngcrush) ваши файлы (и дух), поэтому может быть бесполезно оптимизировать ваши файлы с помощью таких инструментов, как ImageOptim (прочитайте это или это).
- Для значков приложений хорошей идеей (по моему опыту) является использование Single Size в Xcode.