我一直在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?这是永久性的吗?
一些补充说明:
use_frameworks!
。答案 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。
我很确定这是一个工具链问题。