巨大なファイルサイズの変更の原因を見つけるためにGitの歴史をさかのぼりましたが、見つけることができる唯一の本当の理由は、Xcode 6からXcode 7 GMへの切り替えです。
これらは、Archiveビルド構成のRelease操作から作成された.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
最大のファイルは、2つの(わずかに異なる)libswiftCore.dylib
ファイルで、合計で32 MBを超えています。 Xcode 6で構築されたバンドルでは、これら2つのファイルは合計3 MBしかありませんでした。
質問#1は、なぜSwiftコアファイルが2回存在するのですか? (埋め込みコンテンツにSwiftコードが含まれるはNoに設定されます)。
そして質問#2は:何が起こったのですか? Swiftコアサイズが15 MB増加したのはなぜですか?これは永続的ですか?
いくつかの追加のメモ:
use_frameworks!
が設定されたCocoaPodsを使用します。最も可能性が高いのはBitCodeであり、App Storeから展開してもアプリのサイズは実際には成長していませんが、同じ成長を見ています。
アプリや他のターゲットでもBitCodeを無効にすることができ、縮小が見られるはずです。
私は多くの設定と組み合わせをテストしてきましたが、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アセットを使用するため、バンドルサイズが大きくなる可能性が非常に高くなります。
Swift dylibのサイズと独自のコードは、.xcarchiveで大幅に大きくなることが予想されます。また、ビットコードが含まれるため、ストア配布用にエクスポートする場合も予想されます。この追加サイズは、実際にユーザーに配信されるものには反映されないため、問題になることはありません。アプリをストアに送信すると、ストアはビットコードを取り除くためにアプリを処理します。処理されたIPAのバージョンは、ユーザーがダウンロードするものです。
ストアエクスポート(たとえば、アドホック展開用に保存)以外のアーカイブからエクスポートを行う場合、ビットコードをローカルで削除します(エクスポートでそのオプションをオンのままにしておくと、ビットコードからバイナリを再コンパイルします)ストアで何が起こるかを再作成するためのワークフロー)、アプリの実際の大きさを確認できます。また、TestFlightはビットコードを取り除き、実際のアプリのサイズを表示します。
また、アプリのサイズはアプリの細線化によっても縮小できることに注意する必要があります。これについては、 https://developer.Apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introductionで確認できます。 /Introduction.html 。アドホックエクスポートを実行して、とにかくアプリの各間引きバリアントのサイズを確認することができます。
埋め込みビットコードが理由です。
ENABLE_BITCODEを無効にしたくない場合、デバッグシンボルを削除できます。
http://oguzbastemur.blogspot.com/2015/09/xcode-7-and-increaded-binary-size.html を参照してください。ビットコードを埋め込む前にデバッグシンボルを除去することができるオプションの1つ行う。
Swift 1.2でもこの問題が発生しました。この同じ問題に関する元の質問については、 SwiftSupportライブラリが2回含まれないようにする方法 を参照してください。
これはツールチェーンの問題だと確信しています。