Saya telah mundur ke belakang dalam sejarah Git untuk menemukan penyebab perubahan ukuran file yang sangat besar, tetapi satu-satunya alasan sebenarnya yang dapat saya temukan adalah peralihan dari Xcode 6 ke Xcode 7 GM.
Saya telah menemukan bahwa ini adalah 10 besar kontributor ukuran file yang .ipa
dibuat dari operasi Arsip pada konfigurasi build Rilis :
$ 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
Sejauh ini file terbesar adalah dua file (sedikit berbeda) libswiftCore.dylib
, yang totalnya lebih dari 32 MB. Dalam bundel yang dibangun oleh Xcode 6, kedua file ini hanya berukuran 3 MB.
Jadi pertanyaan # 1 adalah: Mengapa file inti Swift ada dua kali? ( Konten Tersemat Berisi Kode Swift diatur ke Tidak ).
Dan pertanyaan # 2 adalah: Apa yang terjadi? Mengapa ukuran inti Swift bertambah 15 MB? Apakah ini permanen?
Beberapa catatan tambahan:
- Ini adalah proyek yang sepenuhnya Objective-C tetapi sekarang kebanyakan Swift. Pengaturan Defines Module diatur ke Yes .
- Proyek ini menggunakan CocoaPods dengan
use_frameworks!
set. - Saya telah mengonfirmasi ukuran unduhan sebenarnya dari TestFlight di beberapa perangkat dan versi iOS dan berkisar antara 30-60 MB (mungkin perbedaannya disebabkan oleh pemotongan aplikasi). Dulu 9 MB.
Jawaban:
Kemungkinan besar disebabkan oleh BitCode, saya telah melihat pertumbuhan yang sama namun setelah diterapkan dari App Store, ukuran aplikasi belum benar-benar berkembang.
Anda dapat menonaktifkan BitCode di aplikasi Anda dan target lainnya juga dan Anda akan melihat penyusutan.
sumber
libswiftCore.dylib
file yang sama persis masing-masing berukuran ~ 40 MB (~ 16 MB terkompresi). Saya belum mengonfirmasi seluruh penerapan melalui TestFlight, tetapi karena file besar ini masih merupakan bagian dari .ipa, saya ragu kontribusi mereka terhadap ukuran file akan berubah. Ukuran keseluruhan menyusut sekitar ~ 10 MB, yang mungkin sebagian besar karena mengambil dukungan simbol crash.Saya telah menguji banyak pengaturan dan kombinasi dan tampaknya ukuran file bundel yang dibuat oleh Xcode 7 sangat bervariasi tergantung pada perangkat dan versi iOS. Selain itu, build TestFlight sekarang sangat besar dibandingkan sebelumnya, tetapi kabar baiknya adalah bahwa di App Store belum ada peningkatan yang besar (meskipun saya melihat sekitar 1–2 MB ditambahkan ke ukuran bundel dibandingkan sebelumnya) .
Berikut beberapa contoh untuk menunjukkan perbedaan antara TestFlight, App Store, dan perangkat:
TestFlight, iPhone 5s pada iOS 9.1
35.6 MB
TestFlight, iPhone 6 di iOS 8.4.1
70.1 MB
App Store
11,8 MB
Ukuran App Store identik di semua perangkat yang saya uji. Saya belum mengujinya di iPhone 6 Plus, sangat mungkin ukuran bundelnya akan lebih besar karena menggunakan aset @ 3x.
sumber
Diharapkan bahwa ukuran dylib swift, dan kode Anda sendiri, akan jauh lebih besar di .xcarchive, dan saat Anda mengekspor untuk distribusi toko, karena penyertaan bitcode. Ukuran tambahan ini tidak akan tercermin dalam apa yang sebenarnya dikirimkan ke pengguna Anda, jadi ini seharusnya tidak menjadi masalah. Saat Anda mengirimkan aplikasi ke toko, toko akan memprosesnya untuk menghapus kode bit, dan versi IPA yang telah diproses tersebut akan diunduh oleh pengguna Anda.
Jika Anda melakukan jenis ekspor apa pun dari arsip Anda kecuali ekspor toko (mis. Simpan untuk penerapan ad-hoc), kami akan menghapus bitcode secara lokal (dan bahkan mengkompilasi ulang binari Anda dari bitcode terlebih dahulu, jika Anda membiarkan opsi itu dicentang di ekspor alur kerja, untuk membuat ulang apa yang akan terjadi di store), sehingga Anda dapat melihat seberapa besar aplikasi Anda nantinya. TestFlight juga akan menghapus bitcode untuk Anda dan menunjukkan ukuran aplikasi Anda yang sebenarnya.
Anda juga harus menyadari bahwa ukuran aplikasi Anda juga dapat dikurangi melalui penipisan aplikasi, yang dapat Anda baca di https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html . Anda mungkin ingin melakukan ekspor ad-hoc untuk melihat ukuran setiap varian aplikasi Anda yang dikurangi.
sumber
Bitcode yang disematkan adalah alasannya.
Dengan asumsi Anda tidak ingin menonaktifkan ENABLE_BITCODE, Anda dapat menghapus simbol debug.
Lihat http://oguzbastemur.blogspot.com/2015/09/xcode-7-and-increaded-binary-size.html karena menghilangkan simbol debug sebelum menyematkan bitcode adalah salah satu opsi yang dapat Anda lakukan.
sumber
Kami juga mengalami masalah ini dengan Swift 1.2. Lihat Bagaimana mencegah pustaka Dukungan Swift untuk disertakan dua kali untuk pertanyaan asli saya tentang masalah yang sama ini.
Saya cukup yakin ini adalah masalah rantai alat.
sumber