如何减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。
- 下载pngout的Mac版本 。
- 将二进制命令行应用程序
pngout
到项目中的目录中。 将二进制文件添加到项目目录可以确保任何人在任何系统上构build项目。
创build构build规则(Xcode 4)
构build规则是特定于目标的,所以如果您有多个目标,则必须将规则复制到每个目标中。
-
将DEBUG和DISTRIBUTIONmacros添加到您的构buildconfiguration中。 优化PNG是相当激烈的处理器,因此您只需要在分发版本上完成。 预处理器macroshttp://i52.tinypic.com/jtteg4.png正如你可以看到其他人已经添加了
DEBUG_BUILD=1
和DISTRIBUTION_BUILD=1
。 -
添加PNG文件的构build规则。 构build规则只是在构build过程中处理特定的文件(和/或)文件types。 这个规则的力量可以链接在一起。 构build规则 – Xcode 4 160wpb4.png
-
点击“添加规则”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应用程序大小
-
解压缩你的ipa来检查video,字体和图像文件等资源。
-
使用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开发者网站的链接 。