Connect with us

Разработка

Как я уменьшил размер моего приложения на 73%

Было больно, но оно того стоило. Размер приложения имеет значение, и я не мог оставить все как есть теперь, когда обнаружил свою ошибку.

Опубликовано

/

     
     

Этим летом я заметил, что мое приложение набрало вес, но я не был уверен, что вызвало это и как это выяснить.

Поиграв с иконкой одного размера, я познакомился с процессом определения размера приложения и решил копнуть дальше.

Последние результаты на 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, я увидел, что самые тяжелые изображения принадлежали этой корове:

Как я уменьшил размер моего приложения на 73%

В ней много деталей, поэтому, конечно, ее было трудно сжать. Три 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, пакет дублируется во всех таргетах, которым он нужен, как показано на этом изображении моего расширения уведомлений.

Как я уменьшил размер моего приложения на 73%

Я вернулся к своему файлу и изменил размер 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.

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: