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

时间:2015-09-15 14:32:01

标签: ios xcode swift

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

我发现这些是 Release 构建配置中 Archive 操作创建的.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构建的捆绑包中,这两个文件总共只有3 MB。

问题#1是:为什么Swift核心文件存在两次? (嵌入式内容包含Swift代码设置为)。

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

一些补充说明:

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

5 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:19)

我一直在测试很多设置和组合,看起来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

App Store
11.8 MB

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

答案 2 :(得分:11)

预计swift dylibs和你自己的代码的大小将在.xcarchive中显着增大,并且当你导出商店分发时,由于包含了bitcode。这个额外的大小不会反映在实际传递给用户的内容中,所以它应该不是问题。当您将应用程序提交到商店时,商店将处理它以去除bitcode,并且IPA的处理版本是您的用户将下载的。

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

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

答案 3 :(得分:5)

嵌入式Bitcode就是原因。

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

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

答案 4 :(得分:0)

Swift 1.2也遇到了这个问题。有关同一问题的原始问题,请参阅How to prevent SwiftSupport libraries to be included twice

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