【问题标题】:Is there any iOS app size inspection tool?是否有任何 iOS 应用程序大小检查工具?
【发布时间】:2017-09-23 19:27:04
【问题描述】:

我正在使用一个同时使用 Objective-c 和 swift 代码的 iOS 应用程序。目前应用 IPA 大小变大了。包含一些资源,但可能不会在 Release IPA 中使用。我想找出应该删除哪些资源以及哪些资源使我的应用程序大小不必要地增加。我想知道是否有任何这样的工具或 xcode profiler 可以分析。

【问题讨论】:

  • 我不知道有没有工具,但是你可以提取你导出的.ipa并在finder中查看它的内容

标签: ios xcode ipa


【解决方案1】:

推荐一款有效的App Size分析工具:

WBBlades

优点:

  1. 链接后直接测量.a或.framework的大小,无需反复编译。
  2. 清晰显示两个版本之间的差异,帮助您控制不断增加的大小。
  3. 有效检测未使用的代码(ObjC 和 Swift)
  4. 广泛应用于物霸公司的应用中

【讨论】:

    【解决方案2】:

    目前我找到的最好的工具是https://github.com/tinymind/LSUnusedResources

    LSUnusedResources

    一个 Mac 应用程序,用于在 XCode 项目中查找未使用的图像和资源。受jeffhodnett的Unused影响很大,但是Unused很慢,结果也不完全正确。所以做了一些性能优化,搜索速度比Unused更快。

    导出未使用的资源列表

    使用此工具,将未使用/未引用的资源列表导出到used.txt

    从 Xcode .pbxproj 文件中删除引用

    使用以下 python 脚本从 project.pbxproj 文件中删除引用:

        file = open("unused.txt","r")
        data = [line.rstrip('\n') for line in open("project.pbxproj", 'r')]
        newFile = open("project2.pbxproj","w")
        
        def removeLine(imageName):
                temp = data 
                for line_s in temp:
                        if line_s.find(imageName) != -1:
                                data.remove(line_s)
                        else:
                                continue        
                 
        for line in file:
                if (len(line) > 5):
                        tokens = line.split("/")
                        len_a = len(tokens)
                        imageName =  tokens[len_a-1]
                        removeLine(imageName.rstrip('\n'))
        
        for line in data:
                newFile.write(line)
                newFile.write('\n')
    

    还有一个替代脚本,在 bash 中:

        #!/bin/bash
    
        UNUSED_ASSETS_FILENAME="unused-images.txt"
        XCODEPROJ_PATH="zilly.xcodeproj/project.pbxproj"
    
        while read LINE; do
          FILENAME="$(basename "$LINE")"
          if [[ $FILENAME =~ (png|jpeg|jpg|gif)$ ]]; then
            echo "Removing '$FILENAME' references from $XCODEPROJ_PATH"
            sed -i '' "/$FILENAME/d" $XCODEPROJ_PATH
          fi
        done < $UNUSED_ASSETS_FILENAME
    

    【讨论】:

    • 为什么不直接点击应用程序本身方便的“删除”按钮(跳过 python 脚本)?
    • 没关系,我明白了。当我发布时,我已经很好地编译了该应用程序,但可能是因为它使用了缓存的构建信息。在 CI 上,构建失败,因为 Xcode 引用了一个从捆绑包而不是作为 xcasset 访问的单个文件。结果我尝试了上面的脚本(可能是 3 年前发布的),但它对我不起作用。所以我最终为此编写了自己的 bash 脚本。我会建议对答案进行编辑以包含 bash 脚本替代方案:)
    【解决方案3】:

    首先,您使用的是最新的 Xcode 版本吗? Xcode 8.3 生成的二进制文件比 Xcode 8.2 大 2-3 倍,Apple 在 8.3.1 中修复了这个错误。

    另外,您可以查看On Demand Resources,它可以让您将重资产上传到 App Store,但不会捆绑在应用中 - 当用户下载您的应用时,iOS 会自动下载必要的资产以正常运行应用程序。

    您可以将.ipa 文件更改为具有.zip 扩展名并将其解压缩。您稍后可以对未归档的.zip 文件使用简单检查(例如Disk Inventory X)和 看看那里发生了什么。

    此外,您可能正在查看 App Store 提交 .ipa,其中将包含必要的 dSYM 文件和其他杂项数据。

    您可以按照this answer 中的步骤查看应用在不同设备上的 App Store .ipa 尺寸。

    最后但同样重要的是,请查看 Apple 提供的 this Q&A,了解如何减小应用程序的大小。

    【讨论】:

    • 感谢您的回答。我正在使用 Xcode 8.3.1。我已经阅读了应用程序大小减少指南。我的主要目的是从 IPA 中删除未使用和非参考的资源和代码。想知道有没有什么办法。
    • 按需资源”的链接显示:“此文档不再更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2011-09-18
    • 2011-12-12
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多