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

如何减小iPhone应用程序的大小?,iphone,xcode,ipad,compression,ipa,Iphone,Xcode,Ipad,Compression,Ipa,备选标题(用于辅助搜索) 压缩PNG 减小iPhone存档(.ipa)的大小 添加生成规则以压缩Xcode中的图像 iOS应用程序只有在小于100MB时才能通过3G下载。减少应用程序大小的最佳策略是什么 我想重点关注的领域是: 数据库 代码 静态库 NB:原始问题可以在该问题的修订版中查看PNG确实是无损图像压缩的最佳选择。您可以使用优化PNG的大小,但我可以询问哪些文件占用了大量空间吗?它与非调试版本相比如何 编辑:如果您想要PNGOUT的免费GUI版本,请查看。调试版本通常比发布版本

备选标题(用于辅助搜索)

压缩PNG 减小iPhone存档(.ipa)的大小 添加生成规则以压缩Xcode中的图像
iOS应用程序只有在小于100MB时才能通过3G下载。减少应用程序大小的最佳策略是什么

我想重点关注的领域是:

  • 数据库
  • 代码
  • 静态库

NB:原始问题可以在该问题的修订版中查看

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


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

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

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

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

添加Xcode生成规则以压缩PNG iOS应用程序中的图像可以占大部分大小。如果它是一个通用应用程序,要求所有图像一式三份(iPhone标准,iPhone和iPad),则尤其如此

。当您的设计师在Photoshop中创建这些图像时,它们会与大量可以丢弃的元数据一起保存

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

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

  • 将二进制命令行应用程序
    pngout
    复制到项目中的目录。
    将二进制文件添加到项目目录可确保在任何系统上构建项目的任何人都可以使用
  • 创建生成规则(Xcode 4) 生成规则是特定于目标的,因此如果有多个目标,则必须将规则复制到每个目标中

  • 将调试和分发宏添加到您的构建配置中。优化PNG需要大量处理器,因此您只希望在分发构建中进行优化。 正如您所看到的,我已经添加了
    DEBUG\u BUILD=1
    DISTRIBUTION\u BUILD=1

  • 为PNG文件添加生成规则。生成规则仅在生成过程中处理特定文件(和/或)文件类型。这一点的力量在于,规则可以链接在一起

  • 点击“添加规则”按钮

    • 将进程设置为“名称匹配的源文件”及其值
      *.png
    • 将Using设置为“自定义脚本”
  • 将此代码粘贴到脚本框中

    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\u预处理器\u定义}
      -上面设置的宏
    这项工作是在这条线上完成的:

        "${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}
    ,看看它是否是
    发行版_BUILD
    ,如果是,它使用
    pngout
    优化文件,否则它会将其复制到
    ${DERIVED_FILES_DIR}
    以便Xcode可以继续处理它


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

    @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\u FILE\u REGION\u PATH\u COMPONENT
    预先添加到导出路径,以使图像的定位正常工作<代码>输入文件\区域\路径\组件通常为空,除非特定文件有本地化文件夹。在这种情况下,它提供了文件夹名称和尾部斜杠,因此您不必这样做

    您还必须将
    Output Files
    设置更改为
    ${DERIVED_Files_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}
    ,才能正常工作


    我不确定我是否是唯一一个有过这个问题的人,但希望它能帮助一些人。

    我用它来缩小应用程序的大小。更多信息,请查看本案例研究

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

    配置iOS应用程序大小

  • 解压缩ipa以查看视频、字体和图像文件等资源

  • 使用Linkmap文件和按库和对象文件(类)配置二进制文件

  • 减少图像文件

      <