如何减less我的iPhone应用程序的大小?

替代标题(帮助search)

压缩PNG

减小iPhone档案(.ipa)的大小

添加一个构build规则来压缩Xcode中的图像


iOS应用程序只能通过3G下载,如果它们小于100MB。 什么是减小应用程序大小的最佳策略?

我想要关注的领域是:

  • 图片
  • 数据库
  • 静态库

注: 原来的问题可以在这个问题的修改中看到

PNG真的是无损图像压缩的最佳select。 您可以使用PNGOUT优化您的PNG大小,但是我可以查询哪些文件特别占用了大量空间? 它与非debugging版本相比如何?

编辑:如果您想要一个免费的PNGOUT GUI版本,请查看PNGGauntlet 。

添加一个Xcode构build规则来压缩PNG

iOS应用程序中的图像可以占据其大小的大部分。 如果它是一个通用应用程序要求它具有三重所有图像(iPhone标准版,iPhone Retina iPad),则更是如此。

在iOS应用程序中使用的最佳图像types是PNG 。 当您的devise师在Photoshop中创build这些图像时,会保存大量可丢弃的元数据。

但是,您不希望完全丢失所有这些数据,因为如果他们需要更改图像,这对于devise人员非常有用。

PNGOUT优化

有几种优化PNG文件的工具,但是pngout似乎是最好的select。

  1. 下载pngout的Mac版本 。
  2. 将二进制命令行应用程序pngout到项目中的目录中。 将二进制文件添加到项目目录可以确保任何人在任何系统上构build项目。

创build构build规则(Xcode 4)

构build规则是特定于目标的,所以如果您有多个目标,则必须将规则复制到每个目标中。

  1. 将DEBUG和DISTRIBUTIONmacros添加到您的构buildconfiguration中。 优化PNG是相当激烈的处理器,因此您只需要在分发版本上完成。 预处理器macroshttp://i52.tinypic.com/jtteg4.png正如你可以看到其他人已经添加了DEBUG_BUILD=1DISTRIBUTION_BUILD=1

  2. 添加PNG文件的构build规则。 构build规则只是在构build过程中处理特定的文件(和/或)文件types。 这个规则的力量可以链接在一起。 构build规则 – Xcode 4 160wpb4.png

  3. 点击“添加规则”button;

    • 将进程设置为“名称匹配的源文件”及其值*.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" 

有几个环境variables值得注意:

  • ${INPUT_FILE_PATH} – 图像文件的完整path
  • ${INPUT_FILE_NAME} – 图片文件名(带扩展名)
  • ${DERIVED_FILES_DIR} – Xcode存储构build文件等
  • ${GCC_PREPROCESSOR_DEFINITIONS} – 您在上面设置的macros

这项工作是在这条线上完成的:

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

${PROJECT_DIR}是项目的完整path, -y覆盖现有文件, -q限制pngout的输出, -force限制pngout以2的状态退出,当文件无法优化并导致Xcode报告生成错误。

这个脚本简单地testing${GCC_PREPROCESSOR_DEFINITIONS}来查看它是否是一个DISTRIBUTION_BUILD如果是的话,它使用pngout来优化文件,否则它复制到${DERIVED_FILES_DIR}所以Xcode可以继续处理它。

最后 ,别忘了将${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}到“输出文件”列表中,这是Xcode知道如何find您已处理的文件的方式。

debugging版本通常会比发布版本大得多。 尝试在发布模式下构build。

有几个编译器选项可能也有帮助。 不知道最新的iPhone发行模式默认。 -Os将针对较小的二进制进行优化。 也有一个死代码剥离的选项,将删除任何永远不能运行的代码。 也可以尝试剥离二进制..不知道如果这适用于iphone二进制文件。

这是假设您的问题是由于可执行二进制大小,而不是图像资源。

我使用ImageOptim和ImageAlpha来减小应用程序的大小。 看看这个casestudy更多的信息。 Tweetbot为iPad

@ rjstelling有一个非常好的答案,我不能说更好,但有一个小问题。 它不会与本地化的图像。 这只是一个问题,如果你在图像中embedded文本,这是我强烈build议永远不要做,如果你可以避免它。 但是,如果您必须使用本地化的图像,请遵循所有步骤,除了使用以下内容:

 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 

注意唯一的变化是导出文件path。 您必须将INPUT_FILE_REGION_PATH_COMPONENT到导出path才能使图像本地化正常工作。 INPUT_FILE_REGION_PATH_COMPONENT通常是空的,除非有特定文件的本地化文件夹。 既然如此,它提供了文件夹名称和一个结尾的斜杠,所以你不必这样做。

您还必须将“ Output Files设置更改为${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}才能使其工作。

不知道我是否是唯一一个遇到过这个问题的人,但希望能帮助别人。

在过去的几个月里,我已经将iOS应用从90MB减less到了50MB。 这里有一些提示和工具:

configurationiOS应用程序大小

  1. 解压缩你的ipa来检查video,字体和图像文件等资源。

  2. 使用Linkmap文件和XCode Linkmap Parser,通过库和对象文件(类)来分析您的二进制文件。

减less图像文件

  • 使用ImageOptim-CLI自动执行图像压缩过程
  • 使用Unused-image查找未使用的图像文件

减less二进制文件

  • 去除debugging符号
  • 使用fui查找未使用的import

检查一个.ipa文件

只需将.ipa文件的扩展名更改为.zip,然后使用Finder将其打开即可对其进行解压缩。 右键单击解压缩的.app包,然后select“Show Package Contents”来查看里面的资源。 这可以让你知道什么是使用最多的空间。

您可以通过打开terminal并执行以下命令来检查.ipa中每个项目的压缩大小:

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

大小列具有您的.ipa文件中每个文件的压缩大小。 您应该评估此大小,以减less应用程序中资源的大小。 您可能会减less资源的大小,但在生成.ipa文件后,您可能会发现该资源的压缩大小没有发生显着变化。 减小.ipa文件大小的最有效方法是删除不必要的资源。

要访问完整的文章,请参阅Apple开发者网站的链接 。