【问题标题】:How to reduce the size of my iPhone application?如何减小我的 iPhone 应用程序的大小?
【发布时间】:2019-08-12 11:22:45
【问题描述】:

替代标题(帮助搜索)

压缩 PNG

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

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


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

我想关注的领域是:

  • Images
  • 数据库
  • 代码
  • 静态库

注意: 原题可以在本题的修改中查看

【问题讨论】:

    标签: iphone xcode ipad compression ipa


    【解决方案1】:

    添加 Xcode 构建规则以压缩 PNG

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

    The best type of image to use in an iOS App is a PNG。当您的设计师在 Photoshop 中创建这些图像时,它们会保存有大量可以丢弃的元数据。

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

    PNGOUT 优化

    有多种工具可用于优化 PNG 文件,但 pngout 似乎是最佳选择。

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

    创建构建规则 (Xcode 4)

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

    1. 将 DEBUG 和 DISTRIBUTION 宏添加到您的构建配置中。 优化 PNG 对处理器来说是相当密集的,因此您只想在分发构建中执行此操作。 如您所见,我添加了DEBUG_BUILD=1DISTRIBUTION_BUILD=1

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

    3. 点击“添加规则”按钮;

      • 将进程设置为“名称匹配的源文件”及其值*.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 知道如何找到您已处理的文件的方式。

    【讨论】:

    • 还值得考虑您要节省的 PNG 的“类型”。有时,您可以切换到优化的调色板图像,并在输入 pngcrush 之前减少使用的不同颜色的数量,以进一步节省大量成本。我使用gimp 来执行此操作,并且效果很好。我相信你可以用 Photoshop 做同样的事情。缺点是您需要逐个图像地做出此决定。
    • 请注意:如果您在归档时遇到问题,请确保正确设置 pngout 可执行文件的路径。
    【解决方案2】:

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

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

    【讨论】:

    • 我为几张图片尝试了 PNGOUT。它从图片中挤出了大约 10s 的 kb。对于 100 张图片,可能会节省大约 2 mb。所以如果PNG真的是最好的选择,我正在考虑减少图片的物理尺寸。问题再次是这些图片包含昆虫的“实际大小”。我想我需要做很多工作才能将它们分离为图层并减小某些图层的尺寸并将它们展平以制作 png。我想我会保留 PNGOUT 作为挤出更多 MB 的最后一步。感谢您的建议。
    • 自己优化图片的时候一定要fix Xcode config,否则Xcode会撤销优化! • 除了PNGOUT,我建议使用pngquant。这给出了绝对最小的 PNG 文件大小。
    • @paul 1. swift 代码中有@objc 之类的标签和公共类会影响ipa 的大小吗?如果是,它在字节顺序中的重要性。 2.另外,我见过(个人但反复地)编写在swift中执行相同操作的代码与在objective c中编写时相比会产生更大的ipa。有什么原因吗?
    • @Ran:恐怕我对 Swift 不熟悉,建议发布一个新问题。
    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢您的建议。我尝试在发布模式下这样做。模拟器版本为 48.3 mb,iPhone 版本为 55.9 mb。模拟器版本减少了一半以上,而 iPhone 版本仅减少了 1 mb。我不确定如何从图像资源中单独计算可执行二进制文件。我正在清理一些代码,但我发现图像资源占用了大部分空间。
    • @Sudharsanan 我注意到,当我测试我的构建(开发阶段)时,每次构建后似乎都会增加应用程序的大小(好像它没有被覆盖) )。尝试从您的 iPhone 中删除该应用程序,然后重新运行/重新构建。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      @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} 才能使其正常工作。

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

      【讨论】:

        【解决方案6】:

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

        分析 iOS 应用程序大小

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

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

        减少图像文件

        减少二进制文件

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

        【讨论】:

          【解决方案7】:

          检查 .ipa 文件

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

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

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

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

          要访问整篇文章,请参阅 Apple 开发者网站上的 link

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-23
            • 1970-01-01
            • 2023-04-04
            相关资源
            最近更新 更多