切换到Xcode 7后,应用程序大小从9 MB增加到60 MB,是否有修复?

我一直在Git历史上倒退,以find一个巨大的文件大小变化的原因,但我能find的唯一真正的原因是从Xcode 6切换到Xcode 7 GM。

我发现这些是在发布构buildconfiguration上通过归档操作创build的.ipa前10个文件大小的贡献者:

 $ 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构build的包中,这两个文件总计只有3 MB。

所以问题1是:为什么Swift核心文件有两次? ( embedded的内容包含Swift代码设置为 )。

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

一些附加说明:

  • 这是一个完全Objective-C的项目,但现在主要是Swift。 “ 定义模块”设置设置为“ 是”
  • 该项目使用CocoaPods和use_frameworks! 组。
  • 我已经在多个设备和iOS版本上确认了TestFlight的实际下载大小,范围在30-60 MB(大概差别是由于应用程序切片)。 它曾经是9 MB。

最有可能是由BitCode引起的,但是从App Store部署后,我看到了同样的增长,应用程序的规模并没有真正增长。

您可以禁用您的应用程序和其他目标的BitCode,你应该看到收缩。

我一直在testing很多设置和组合,看起来Xcode 7创build的bundle的文件大小因设备和iOS版本而异。 此外,与之前相比,TestFlight的构build现在是巨大的,但好消息是,一旦在App Store上没有大幅增加(虽然我看到相比之前,大约1-2 MB添加到包的大小) 。

以下是一些示例,显示TestFlight,App Store和设备之间的差异:

TestFlight,iOS 9.1上的iPhone 5s
35.6 MB

iOS 8.4.1上的TestFlight,iPhone 6
70.1 MB

app store
11.8 MB

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

预计在.xcarchive中,swift dylib的大小和你自己的代码将会大得多,而且当你为store分配导出时,由于包含了bitcode。 这个额外的大小将不会反映到实际交付给用户的内容中,所以它不应该是一个问题。 当您将应用程序提交到商店时,商店将处理它以去掉位代码,并且IPA的处理版本是您的用户将要下载的内容。

如果除了存储导出(除了存储导出)之外,从存档中进行任何types的导出(例如,保存为临时部署),我们将在本地剥离位代码(甚至可以先从位代码重新编译二进制文件,如果在导出中保留该选项工作stream程,重新创build会发生什么事情),所以你可以看到你的应用程序实际上有多大。 TestFlight还会为您删除位码,并向您显示您的真实应用程序大小。

您还应该知道,您的应用程序的大小也可以通过应用程序细化来减less,您可以通过以下url阅读: https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html 。 您可能希望执行临时导出来查看应用程序的每个细化变体的大小。

embedded位码是原因。

假设你不想禁用ENABLE_BITCODE,你可以去掉debugging符号。

请参阅http://oguzbastemur.blogspot.com/2015/09/xcode-7-and-increaded-binary-size.html作为剥离debugging符号之前embedded位代码是您可以做的选项之一。;

我们在Swift 1.2中也遇到了这个问题。 有关同样的问题,请参阅如何防止SwiftSupport库包含两次原始问题。

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