【问题标题】:After switching to Xcode 7, app size grew from 9 MB to 60 MB, is there a fix?切换到 Xcode 7 后,应用程序大小从 9 MB 增长到 60 MB,有解决办法吗?
【发布时间】:2015-09-15 14:32:01
【问题描述】:

我一直在追溯 Git 历史,寻找文件大小发生巨大变化的原因,但我能找到的唯一真正原因是从 Xcode 6 切换到 Xcode 7 GM。

我发现这些是.ipa 中文件大小的前 10 大贡献者,该文件是通过 Release 构建配置上的 Archive 操作创建的:

$ unzip -lv Roger\ Release.ipa | sort -k +3nr | head
41802768  Defl:N 16887199  60%  09-14-15 23:47  dc24cdc1  Payload/Roger.app/Frameworks/libswiftCore.dylib
41802400  Defl:N 16886076  60%  09-06-15 18:33  f939ea6a  SwiftSupport/iphoneos/libswiftCore.dylib
11184032  Defl:N  5915625  47%  09-14-15 23:48  6ceac4a2  Payload/Roger.app/Roger
 6399584  Defl:N  2670275  58%  09-14-15 23:47  0ac52d3f  Payload/Roger.app/Frameworks/libPhoneNumber_iOS.framework/libPhoneNumber_iOS
 5410384  Defl:N  2334189  57%  09-14-15 23:47  7a8cb03f  Payload/Roger.app/Frameworks/Alamofire.framework/Alamofire
 4521904  Defl:N  2292789  49%  09-14-15 23:47  95da0882  Payload/Roger.app/Frameworks/FBSDKCoreKit.framework/FBSDKCoreKit
 4731552  Defl:N  1926357  59%  09-14-15 23:48  e05337de  Payload/Roger.app/Frameworks/libswiftFoundation.dylib
 4731168  Defl:N  1925355  59%  09-06-15 18:33  19a5c3c4  SwiftSupport/iphoneos/libswiftFoundation.dylib
 2659232  Defl:N  1232897  54%  09-14-15 23:47  1a53a401  Payload/Roger.app/Frameworks/AFNetworking.framework/AFNetworking
 1196624  Defl:N   545343  54%  09-14-15 23:47  19a063cb  Payload/Roger.app/Frameworks/Bolts.framework/Bolts

到目前为止,最大的文件是两个(略有不同)libswiftCore.dylib 文件,总大小超过 32 MB。在 Xcode 6 构建的包中,这两个文件总共只有 3 MB。

所以问题 #1 是:为什么 Swift 核心文件会出现两次? (Embedded Content Contains Swift Code 设置为 No)。

问题 #2 是:发生了什么?为什么 Swift 核心大小增加了 15 MB?这是永久的吗?

一些补充说明:

  • 这是一个完全是 Objective-C 但现在主要是 Swift 的项目。 Defines Module 设置设为Yes
  • 该项目使用设置了use_frameworks! 的CocoaPods。
  • 我已经在多个设备和 iOS 版本上确认了来自 TestFlight 的实际下载大小,它在 30–60 MB 的范围内(可能差异是由于应用程序切片造成的)。以前是 9 MB。

【问题讨论】:

  • Xcode 7 使用应用切片,下载大小很可能会有所不同,甚至可能会减小。我不会担心这个。
  • @Adam:事实并非如此。部署的版本确实因设备而异,但到目前为止,我在 iPhone 5s 上看到了 30 MB,在 iPhone 6 上看到了 60 MB。安装时间明显增加。当它曾经是 9 MB 时,这绝对是值得担心的事情。
  • 实际上 30 和 60 MB 的差异很可能是因为 iPhone 5s 是 iOS 9.1 而 iPhone 6 是 iOS 8。但即使所有应用程序用户都升级到 iOS 9,30 MB与 9 MB 相比仍然有很大的增长。
  • 您是通过 TestFlight 部署的吗?应用瘦身是在 Apple 服务器上完成的,所以除非你通过 TestFlight/iTunes 安装,否则我认为你将看不到减小的大小。
  • 上传到TestFlight后,我的app大小从74MB减少到9.6MB,不用担心

标签: ios xcode swift


【解决方案1】:

很可能是由 BitCode 引起的,我看到了同样的增长,但是从 App Store 部署后,应用程序的大小实际上并没有增长。

您可以在您的应用和其他目标中禁用 BitCode,您应该会看到收缩。

【讨论】:

  • 我已确认来自 Apple TestFlight 的应用程序下载大小为 30 到 60 MB,而不是 9 MB。我不认为它在 App Store 上会改变,因为它们可能使用相同的分发机制。我会尝试禁用 Bitcode。
  • 在构建和发布步骤中禁用位码和调试符号以及归档构建版本仍然包含完全相同的两个 libswiftCore.dylib 文件,每个文件约 40 MB(压缩后约 16 MB)。我还没有通过 TestFlight 确认整个部署,但是由于这些巨大的文件仍然是 .ipa 的一部分,我怀疑它们对文件大小的贡献会改变。整体大小缩小了约 10 MB,这可能主要是由于取消了对崩溃符号的支持。
  • 我只是从个人经验出发,我的 .xcarchive 现在比 Xcode7 之前大了很多,但是由于资源稀疏等原因,应用商店下载的大小即使不是稍微小一点,也仍然是相同的大小。
  • 现在看,TestFlight 的捆绑包是 33MB,而 AppStore 上的相同版本为 10.5MB,这表明在 TestFlight 版本上没有进行精简。
  • 好的,很高兴知道这一点。我会将应用程序运行到 App Store 并希望取得最好的成绩!
【解决方案2】:

我已经测试了很多设置和组合,似乎 Xcode 7 创建的包的文件大小因设备和 iOS 版本而有很大差异。此外,与以前相比,TestFlight 构建现在非常庞大,但好消息是,一旦在 App Store 上,并没有显着增加(尽管我看到与以前相比,捆绑包大小增加了大约 1-2 MB) .

这里有几个示例可以显示 TestFlight、App Store 和设备之间的差异:

TestFlight,iOS 9.1 上的 iPhone 5s
35.6 MB

TestFlight,iOS 8.4.1 上的 iPhone 6
70.1 MB

应用商店
11.8 MB

App Store 大小在我测试的所有设备上都是相同的。不过我还没有在 iPhone 6 Plus 上测试过,因为它使用了 @3x 资源,所以捆绑包的大小很可能会更大。

【讨论】:

    【解决方案3】:

    预计 swift dylib 的大小和您自己的代码在 .xcarchive 中以及当您导出以用于商店分发时,由于包含位码,将显着增大。这个额外的大小不会反映在实际交付给您的用户的内容中,因此它应该不是问题。当您将应用提交到商店时,商店会对其进行处理以去除位码,而经过处理的 IPA 版本就是您的用户将下载的版本。

    如果您从存档中执行任何类型的导出(例如存储导出除外)(例如,保存以进行临时部署),我们将在本地剥离位码(如果您保留该选项,我们甚至会首先从位码重新编译您的二进制文件在导出工作流程中,重新创建将在商店中发生的事情),这样您就可以看到您的应用程序实际有多大。 TestFlight 还会为您剥离位码并显示您的真实应用大小。

    您还应该知道,您的应用程序的大小也可以通过应用程序细化来减小,您可以在https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html 阅读有关此内容的信息。无论如何,您可能希望执行临时导出以查看应用的每个精简变体的大小。

    【讨论】:

      【解决方案4】:

      嵌入式位码是原因。

      假设您不想禁用 ENABLE_BITCODE,您可以去除调试符号。

      请参阅http://oguzbastemur.blogspot.com/2015/09/xcode-7-and-increaded-binary-size.html,因为在嵌入位码之前剥离调试符号是您可以执行的选项之一。

      【讨论】:

      • 这是否意味着您不会收到符号化的崩溃报告?
      【解决方案5】:

      我们在 Swift 1.2 中也遇到过这个问题。请参阅How to prevent SwiftSupport libraries to be included twice,了解我关于同一问题的原始问题。

      我很确定这是一个工具链问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        • 1970-01-01
        • 2018-01-16
        相关资源
        最近更新 更多