如何减小我的iPhone应用程序的大小?

时间:2010-03-22 09:01:22

标签: iphone xcode ipad compression ipa

替代标题(以帮助搜索)

压缩PNG

缩小iPhone档案(.ipa)

的大小

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


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

我想关注的领域是:

  • Images
  • 数据库
  • 代码
  • 静态图书馆

注意: 原始问题可在此问题的修订版中查看

7 个答案:

答案 0 :(得分:23)

添加Xcode构建规则以压缩PNG

iOS应用中的图像可以构成其大部分尺寸。如果它是一个通用应用程序,要求所有图像一式三份(iPhone标准版,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复制到项目中的目录。将二进制文件添加到项目目录,确保在任何系统上构建项目的任何人都可以使用它
  3. 创建构建规则(Xcode 4)

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

    1. 将DEBUG和DISTRIBUTION宏添加到您的构建配置中。优化PNG的处理器非常强大,因此您只想在分发版本上执行此操作。 Pre-processor macros http://i52.tinypic.com/jtteg4.png正如您所看到的那样,我添加了DEBUG_BUILD=1DISTRIBUTION_BUILD=1

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

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

      • 将“处理”设置为“名称匹配的源文件”及其值*.png
      • 将使用设置为“自定义脚本”
    4. 将此代码粘贴到脚本框

      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)

我使用ImageOptimImageAlpha来缩小应用尺寸。有关更多信息,请查看此案例研究。 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应用程序大小

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

  2. 使用Linkmap文件和XCode Linkmap Parser按库和目标文件(类)配置二进制文件。

  3. 减少图像文件

    减少二进制文件

    • 剥离调试符号
    • 使用fui
    • 查找未使用的导入

答案 6 :(得分:0)

检查.ipa文件

  

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

     

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

     

unzip -lv /path/to/your/app.ipa

     

size列具有.ipa中每个文件的压缩大小   文件。您应该在努力减小尺寸时评估此尺寸   您应用中的资源。您可以减少很多资源的大小,   但是在生成.ipa文件后,您可能会发现压缩的大小   该资源没有大幅改变。最有效的   减少.ipa文件大小的技术是删除   不必要的资源。

要访问完整文章,请参阅Apple Developer网站上的link