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