31

替代标题(帮助搜索)

压缩 PNG

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

在 Xcode 中添加构建规则以压缩图像


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

我想关注的领域是:

  • 图片
  • 数据库
  • 代码
  • 静态库

注意: 原始问题可以在这个问题的修订中查看

4

7 回答 7

23

添加 Xcode 构建规则以压缩 PNG

iOS 应用程序中的图像可以占其大小的大部分。如果它是一个通用应用程序,要求它具有一式三份的所有图像(iPhone Standard、iPhone Retina iPad),则尤其如此。

在 iOS 应用程序中使用的最佳图像类型是 PNG。当您的设计师在 Photoshop 中创建这些图像时,它们会保存有许多可以丢弃的元数据。

但是,您不想完全丢失所有这些数据,因为如果设计人员需要更改图像,这对他们很有用。

PNGOUT优化

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

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

创建构建规则 (Xcode 4)

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

  1. 将 DEBUG 和 DISTRIBUTION 宏添加到您的构建配置中。优化 PNG 是相当密集的处理器,因此您只想在分发版本上进行。预处理器宏 正如你所看到的,我已经添加了DEBUG_BUILD=1DISTRIBUTION_BUILD=1

  2. 为 PNG 文件添加构建规则。构建规则只是在构建过程中处理特定的文件(和/或)文件类型。规则的力量是可以链接在一起的。构建规则 - Xcode 4 http://tinypic.com/images/404.gif

  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限制pngouts 输出并-force防止pngout在无法优化文件并导致 Xcode 报告构建错误时以状态 2 退出。

这个脚本只是简单地测试一下${GCC_PREPROCESSOR_DEFINITIONS},看看它DISTRIBUTION_BUILD是否是pngout用来优化文件的,否则它会将它复制到${DERIVED_FILES_DIR}Xcode 可以继续处理它。

最后,不要忘记添加${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}到“输出文件”列表中,这是 Xcode 知道如何找到您已处理的文件的方式。

于 2011-08-02T09:16:39.423 回答
6

PNG确实是无损图像压缩的最佳选择。您可以使用PNGOUT优化 PNG 的大小,但我可以询问哪些文件特别占用了很多空间吗?它与非调试版本相比如何?

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

于 2010-03-22T09:05:01.420 回答
4

调试版本通常比发布版本大得多。尝试在发布模式下构建。

有一些编译器选项也可能有所帮助。虽然不确定 iphone 发布模式的默认设置是什么。-Os 将针对较小的二进制文件进行优化。还有一个用于删除死代码的选项,它将删除任何永远无法运行的代码。您也可以尝试剥离二进制文件.. 不确定这是否适用于 iphone 二进制文件。

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

于 2010-03-22T09:05:13.733 回答
3

我使用ImageOptimImageAlpha来减小应用程序的大小。查看此案例研究以获取更多信息。适用于 iPad 的 Tweetbot

于 2013-02-27T00:56:29.240 回答
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}为以使其正常工作。

不确定我是否是唯一一个遇到过这个问题的人,但希望它可以帮助某人。

于 2012-10-01T21:54:35.393 回答
1

在过去的几个月里,我将 iOS 应用程序从 90MB 减少到了 50MB。以下是一些提示和工具:

分析 iOS 应用程序大小

  1. 解压缩您的 ipa 以检查视频、字体和图像文件等资源。

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

减少图像文件

减少二进制文件

  • 剥离调试符号
  • 使用fui查找未使用的导入
于 2016-03-25T08:46:57.447 回答
0

检查 .ipa 文件

只需将 .ipa 文件的扩展名更改为 .zip,然后使用 Finder 打开它即可解压缩。右键单击解压缩的 .app 包并选择“显示包内容”以查看其中的资源。这可以让您了解什么是使用最多的空间。

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

解压 -lv /path/to/your/app.ipa

size 列包含 .ipa 文件中每个文件的压缩大小。当您努力减少应用程序中的资源大小时,您应该评估此大小。您可能会大大减少资源的大小,但是在生成 .ipa 文件后,您可能会发现该资源的压缩大小并没有发生太大变化。减小 .ipa 文件大小的最有效技术是删除不必要的资源。

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

于 2016-09-16T06:59:34.820 回答