替代标题(以帮助搜索)
如果iOS应用程序小于100MB,则只能通过3G下载。减少应用程序大小的最佳策略是什么?
我想关注的领域是:
注意: 原始问题可在此问题的修订版中查看
答案 0 :(得分:23)
iOS应用中的图像可以构成其大部分尺寸。如果它是一个通用应用程序,要求所有图像一式三份(iPhone标准版,iPhone Retina iPad),则尤其如此。
The best type of image to use in an iOS App is a PNG。当您的设计师在Photoshop中创建这些图像时,它们会保存大量可以丢弃的元数据。
但是,您不希望完全丢失所有数据,因为如果设计师需要更改图像,这对设计人员非常有用。
有几种优化PNG文件的工具,但pngout
似乎是最佳选择。
pngout
复制到项目中的目录。将二进制文件添加到项目目录,确保在任何系统上构建项目的任何人都可以使用它构建规则是特定于目标的,因此如果您有多个目标,则必须将规则复制到每个目标中。
将DEBUG和DISTRIBUTION宏添加到您的构建配置中。优化PNG的处理器非常强大,因此您只想在分发版本上执行此操作。 Pre-processor macros http://i52.tinypic.com/jtteg4.png正如您所看到的那样,我添加了DEBUG_BUILD=1
和DISTRIBUTION_BUILD=1
。
为PNG文件添加构建规则。构建规则只是在构建过程中处理特定文件(和/或)文件类型。这种规则的力量可以链接在一起。 Build Rule - Xcode 4 http://i56.tinypic.com/ioovut.png
点击“添加规则”按钮;
*.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
输出,-force
会阻止pngout
当文件无法优化并导致Xcode报告构建错误时,退出状态为2。
此脚本只是测试${GCC_PREPROCESSOR_DEFINITIONS}
以查看它是DISTRIBUTION_BUILD
,如果是,它使用pngout
来优化文件,否则会将其复制到${DERIVED_FILES_DIR}
所以Xcode可以继续处理它。
最后,不要忘记将${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}
添加到“输出文件”列表中,这就是Xcode知道如何查找已处理文件的方式。
答案 1 :(得分:6)
PNG确实是无损图像压缩的最佳选择。您可以使用PNGOUT优化PNG的大小,但是我可以查询哪些文件特别占用了大量空间吗?它与非调试版本相比如何?
编辑:如果您想要一个免费的GUI版PNGOUT,请查看PNGGauntlet。
答案 2 :(得分:4)
调试版本通常比发布版本大得多。尝试在发布模式下构建。
有一些编译器选项也可能有所帮助。不知道iphone发布模式的默认值是什么。 -Os将针对较小的二进制文件进行优化。还有一个死代码剥离选项,可以删除任何永远无法运行的代码。你也可以尝试剥离二进制文件..但不确定它是否适用于iphone二进制文件。
这假设您的问题是由于可执行的二进制文件大小而不是图像资源。
答案 3 :(得分:3)
我使用ImageOptim和ImageAlpha来缩小应用尺寸。有关更多信息,请查看此案例研究。 Tweetbot for iPad
答案 4 :(得分:1)
@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}
才能生效。
不确定我是否是唯一一个遇到过这个问题的人,但希望它可以帮到某个人。
答案 5 :(得分:1)
在过去的几个月中,我已将iOS应用从90MB减少到50MB。以下是一些提示和工具:
分析iOS应用程序大小
解压缩您的ipa以检查视频,字体和图像文件等资源。
使用Linkmap文件和XCode Linkmap Parser按库和目标文件(类)配置二进制文件。
减少图像文件
减少二进制文件
答案 6 :(得分:0)
检查.ipa文件
只需将.ipa文件的扩展名更改为 .zip,然后用Finder打开它解压缩它。右键单击 解压缩.app包并选择“显示包内容”以查看 里面的资源。这可以让您了解最常用的内容 空间。
您可以检查.ipa中每个项目的压缩大小 打开终端并执行以下命令:
unzip -lv /path/to/your/app.ipa
size列具有.ipa中每个文件的压缩大小 文件。您应该在努力减小尺寸时评估此尺寸 您应用中的资源。您可以减少很多资源的大小, 但是在生成.ipa文件后,您可能会发现压缩的大小 该资源没有大幅改变。最有效的 减少.ipa文件大小的技术是删除 不必要的资源。
要访问完整文章,请参阅Apple Developer网站上的link。