替代标题(以帮助搜索)

压缩 PNG

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

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


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

我想重点关注的领域是:

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

注意: 原问题可以在该问题的修订版中查看

有帮助吗?

解决方案

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

编辑:如果您想要免费的 GUI 版本的 PNGOUT,请查看 PNG挑战.

其他提示

添加 Xcode 构建规则来压缩 PNG

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

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

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

PNG输出优化

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

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

创建构建规则 (Xcode 4)

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

  1. 将 DEBUG 和 DISTRIBUTION 宏添加到您的构建配置中。 优化 PNG 需要大量的处理器资源,因此您只想在发行版本上执行此操作。 Pre-processor macros正如你所看到的,我添加了其他内容 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 限制 pngout的输出和 -force 防止 pngout 当文件无法优化时以状态 2 退出并导致 Xcode 报告构建错误。

该脚本只是测试 ${GCC_PREPROCESSOR_DEFINITIONS} 看看它是否是 DISTRIBUTION_BUILD 如果是这样它使用 pngout 优化该文件,否则会将其复制到 ${DERIVED_FILES_DIR} 这样Xcode就可以继续处理它。

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

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

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

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

我用了 图像优化阿尔法图像 用于减小应用程序大小。请查看此案例研究以获取更多信息。 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 应用程序大小

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

  2. 使用 Linkmap 文件按库和对象文件(类)分析二进制文件 XCode 链接映射解析器.

减少图像文件

减少二进制文件

  • 去除调试符号
  • 使用查找未使用的导入 富伊

检查 .ipa 文件

只需将.IPA文件的扩展名更改为.zip,然后将其与Finder打开以解压缩。右键单击未拉紧的.App捆绑包,然后选择“显示包装内容”以查看里面的资源。这可以使您了解使用最多的空间。

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

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

大小列具有.IPA文件中每个文件的压缩大小。您应该在工作时评估这种尺寸,以减少应用程序中资源的规模。您可能会大量减少资源的大小,但是在生成.IPA文件后,您可能会发现该资源的压缩大小并未发生巨大变化。减少.IPA文件大小的最有效技术是删除不必要的资源。

要访问完整文章,请参阅 关联 来自苹果开发者网站。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top