Как уменьшить размер моего приложения для iPhone? - PullRequest
31 голосов
/ 22 марта 2010

Альтернативные названия (для облегчения поиска)

Сжатие PNG

Уменьшить размер архива iPhone (.ipa)

Добавление правила сборки для сжатия изображений в Xcode


Приложения для iOS можно загружать только через 3G, если они меньше 100 МБ. Каковы наилучшие стратегии для уменьшения размера приложения?

Области, на которых я хотел бы сосредоточиться:

NB: Исходный вопрос можно посмотреть в редакции этого вопроса

Ответы [ 7 ]

23 голосов
/ 02 августа 2011

Добавление правила сборки Xcode для сжатия PNG

Изображения в приложении для iOS могут составлять большую часть их размера. Это особенно верно, если это универсальное приложение, требующее, чтобы все изображения были в трех экземплярах (iPhone Standard, iPhone Retina iPad).

Лучший тип изображения для использования в приложении для iOS - PNG . Когда ваш дизайнер создал эти изображения в Photoshop, они сохраняются с большим количеством метаданных, которые можно отбросить.

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

PNGOUT Оптимизация

Существует несколько инструментов для оптимизации файлов PNG, но pngout представляется наилучшим вариантом.

  1. Загрузить версию pngout для Mac .
  2. Скопируйте двоичное приложение командной строки pngout в каталог с вашим проектом. Добавление двоичного файла в каталог проекта гарантирует, что оно доступно любому, кто создает проект в любой системе.

Создание правила сборки (Xcode 4)

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

  1. Добавьте макросы DEBUG и DISTRIBUTION к вашим конфигурациям сборки. Оптимизация PNG довольно интенсивно использует процессор, поэтому вы можете делать это только в сборках дистрибутива. Макросы препроцессора http://i52.tinypic.com/jtteg4.png Как видите, я добавил DEBUG_BUILD=1 и DISTRIBUTION_BUILD=1.

  2. Добавить правило сборки для файлов PNG. Правило сборки просто обрабатывает файл определенного типа (и / или) в процессе сборки. Сила этого в том, что правила могут быть связаны друг с другом. Правило сборки - Xcode 4 http://i56.tinypic.com/ioovut.png

  3. Нажмите кнопку «Добавить правило»;

    • Установите для Process значение «Исходные файлы с совпадающими именами» и его значение *.png.
    • Установите для параметра «Пользовательский скрипт»

Вставьте этот код в поле скрипта

echo "----------------------------------------------------------------" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
echo "${INPUT_FILE_PATH}" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
echo "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
echo ${GCC_PREPROCESSOR_DEFINITIONS} >> "${DERIVED_FILES_DIR}/pngout-log.txt"

BUILD=`echo ${GCC_PREPROCESSOR_DEFINITIONS} | grep -o DISTRIBUTION_BUILD`

echo $BUILD >> "${DERIVED_FILES_DIR}/pngout-log.txt"

if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then
echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
"${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"
else
echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"
fi

echo "...done." >> "${DERIVED_FILES_DIR}/pngout-log.txt"

Есть несколько переменных среды, которые следует отметить:

  • ${INPUT_FILE_PATH} - полный путь к файлу изображения
  • ${INPUT_FILE_NAME} - имя файла изображения (с расширением)
  • ${DERIVED_FILES_DIR} - где Xcode хранит файлы сборки и т. Д.
  • ${GCC_PREPROCESSOR_DEFINITIONS} - макросы, которые вы установили выше

Работа выполняется по этой строке:

    "${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"

${PROJECT_DIR} - полный путь к вашему проекту, -y перезаписывает существующие файлы, -q ограничивает вывод pngout s и -force предотвращает выход pngout со статусом 2, когда файл может ' быть оптимизированным и вызывать ошибки построения отчета Xcode.

Этот сценарий просто проверяет ${GCC_PREPROCESSOR_DEFINITIONS}, чтобы определить, является ли он DISTRIBUTION_BUILD, если так, то использует pngout для оптимизации файла, в противном случае он копирует его в ${DERIVED_FILES_DIR}, чтобы Xcode мог продолжить его обработку.

Наконец , не забудьте добавить ${DERIVED_FILES_DIR}/${INPUT_FILE_NAME} в список «Выходные файлы», так Xcode знает, как найти файлы, которые вы обработали.

6 голосов
/ 22 марта 2010

PNG действительно лучший вариант для сжатия изображений без потерь.Вы можете оптимизировать PNG по размеру, используя PNGOUT , но могу ли я узнать, какие файлы занимают много места?Чем он отличается от неотладочного релиза?

Редактировать: Если вам нужна бесплатная GUI-версия PNGOUT, взгляните на PNGGauntlet .

4 голосов
/ 22 марта 2010

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

Есть несколько опций компилятора, которые тоже могут помочь.Не уверен, что по умолчанию для режима выпуска iPhone, хотя.-Ос будет оптимизировать для меньшего двоичного файла.Есть также опция для удаления мертвого кода, которая удалит любой код, который никогда не сможет быть запущен.Также вы можете попробовать удалить двоичный файл ... не уверен, работает ли он для двоичных файлов iphone.

Это предполагает, что ваша проблема связана с размером исполняемого двоичного файла, а не с ресурсами изображения.

3 голосов
/ 27 февраля 2013

Я использовал ImageOptim и ImageAlpha для уменьшения размера приложения. Взгляните на это исследование для получения дополнительной информации. Tweetbot для iPad

1 голос
/ 25 марта 2016

За последние несколько месяцев приложение для iOS сократилось с 90 МБ до 50 МБ. Вот несколько советов и инструментов:

В профиль iOS-приложение Размер

  1. разархивируйте ваш ipa для проверки ресурсов, таких как видео, файлы шрифтов и изображений.

  2. Профилируйте ваш двоичный файл по библиотекам и объектным файлам (классам), используя файл Linkmap и XCode Linkmap Parser .

Для уменьшения файлов изображений

  • используйте ImageOptim-CLI для автоматического сжатия изображения
  • используйте Unused-image , чтобы найти неиспользуемые файлы изображений

Для уменьшения двоичного файла

  • Символы отладки полосы
  • Найти неиспользуемый импорт используя fui
1 голос
/ 02 октября 2012

@ rjstelling имеет действительно хороший ответ, и я не могу сказать это лучше, но есть одна небольшая проблема с ним. Это не будет работать с локализованными изображениями. Это проблема, только если вы вставляете текст в изображения, что я настоятельно рекомендую никогда не делать, если вы можете избежать этого. Однако, если вам нужно использовать локализованные изображения, выполните все шаги rjstelling, за исключением того, что вместо:

if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then
echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
"${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"
else
echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}"
fi

используйте код ниже:

if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then
echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
"${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}"
else
echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt"
cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}"
fi

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

Вы также должны изменить настройку Output Files на ${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}, чтобы это работало.

Не уверен, что я единственный, кто когда-либо сталкивался с этой проблемой, но, надеюсь, это кому-нибудь поможет.

0 голосов
/ 16 сентября 2016

Проверка файла .ipa

Просто измените расширение файла .ipa на .zip, затем откройте его с помощью Finder, чтобы распаковать его. Щелкните правой кнопкой мыши на разархивируйте пакет .app и выберите «Показать содержимое пакета», чтобы увидеть ресурсы внутри. Это может дать вам представление о том, что использует наиболее пространство.

Вы можете проверить сжатый размер каждого элемента в вашем .ipa по открыть терминал и выполнить следующую команду:

unzip -lv /path/to/your/app.ipa

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

Чтобы получить доступ к полной статье, см. Ссылку на веб-сайте Apple Developer.

...