J'ai reculé dans l'histoire de Git pour trouver la cause d'un énorme changement de taille de fichier, mais la seule vraie raison que je peux trouver est le passage de Xcode 6 à Xcode 7 GM.
J'ai trouvé que ce sont les 10 principaux contributeurs de taille de fichier dans une opération .ipa
créée à partir de l' opération d' archivage sur une configuration de construction Release :
$ 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
Les fichiers de loin les plus volumineux sont les deux fichiers (légèrement différents) libswiftCore.dylib
, qui totalisent plus de 32 Mo. Dans le bundle construit par Xcode 6, ces deux fichiers ne totalisaient que 3 Mo.
La question n ° 1 est donc la suivante: pourquoi les fichiers de base Swift y sont-ils deux fois? ( Le contenu intégré contient le code Swift est défini sur Non ).
Et la question n ° 2 est: que s'est-il passé? Pourquoi la taille du cœur Swift a-t-elle augmenté de 15 Mo? Est-ce permanent?
Quelques remarques supplémentaires:
- C'est un projet qui était entièrement Objective-C mais qui est maintenant principalement Swift. Le paramètre Définit le module est défini sur Oui .
- Le projet utilise CocoaPods avec
use_frameworks!
set. - J'ai confirmé la taille réelle du téléchargement de TestFlight sur plusieurs appareils et versions iOS et elle est comprise entre 30 et 60 Mo (la différence est probablement due au découpage de l'application). Avant, c'était 9 Mo.
Réponses:
Très probablement causé par BitCode, j'ai vu la même croissance, mais une fois déployée à partir de l'App Store, la taille de l'application n'a pas réellement augmenté.
Vous pouvez également désactiver BitCode dans votre application et les autres cibles et vous devriez voir une réduction.
la source
libswiftCore.dylib
fichiers à ~ 40 Mo chacun (~ 16 Mo compressés). Je n'ai pas confirmé l'intégralité du déploiement via TestFlight, mais comme ces énormes fichiers font toujours partie du .ipa, je doute que leur contribution à la taille du fichier change. La taille globale a diminué d'environ 10 Mo, ce qui est probablement dû principalement à la suppression du support des symboles de crash.J'ai testé de nombreux paramètres et combinaisons et il semble que la taille de fichier des bundles créés par Xcode 7 varie beaucoup en fonction de l'appareil et de la version d'iOS. De plus, les versions de TestFlight sont maintenant énormes par rapport à avant, mais la bonne nouvelle est qu'une fois sur l'App Store, il n'y a pas eu d'augmentation énorme (bien que je vois environ 1 à 2 Mo ajoutés à la taille du bundle par rapport à avant) .
Voici quelques exemples pour montrer la variance entre TestFlight, App Store et les appareils:
TestFlight, iPhone 5s sur iOS 9.1
35,6 Mo
TestFlight, iPhone 6 sur iOS 8.4.1
70,1 Mo
App Store
11,8 Mo
La taille de l'App Store était identique sur tous les appareils que j'ai testés. Je ne l'ai pas testé sur l'iPhone 6 Plus, il est très possible que la taille du bundle soit plus grande car elle utilise des actifs @ 3x.
la source
On s'attend à ce que la taille des dylibs swift et de votre propre code soit considérablement plus grande dans l'archive .xcarchive et lorsque vous exportez pour la distribution en magasin, en raison de l'inclusion du bitcode. Cette taille supplémentaire ne sera pas reflétée dans ce qui est réellement livré à vos utilisateurs, cela ne devrait donc pas poser de problème. Lorsque vous soumettez votre application au magasin, le magasin la traite pour supprimer le bitcode, et cette version traitée de l'IPA est ce que vos utilisateurs téléchargeront.
Si vous effectuez un type d'exportation de votre archive à l'exception d'une exportation de magasin (par exemple, enregistrer pour un déploiement ad-hoc), nous supprimerons localement le bitcode (et même recompilerons vos binaires à partir du bitcode en premier, si vous laissez cette option cochée dans l'exportation workflow, pour recréer ce qui se passera sur le magasin), afin que vous puissiez voir la taille réelle de votre application. TestFlight supprimera également le bitcode pour vous et vous montrera la taille réelle de votre application.
Vous devez également savoir que la taille de votre application peut également être réduite via la réduction de l'application, que vous pouvez lire sur https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html . Vous voudrez probablement effectuer une exportation ad hoc pour voir la taille de chaque variante allégée de votre application de toute façon.
la source
Le Bitcode intégré en est la raison.
En supposant que vous ne souhaitiez pas désactiver ENABLE_BITCODE, vous pouvez supprimer les symboles de débogage.
Consultez http://oguzbastemur.blogspot.com/2015/09/xcode-7-and-increaded-binary-size.html car supprimer les symboles de débogage avant d'incorporer le bitcode est l'une des options que vous pouvez faire.
la source
Nous avons également eu ce problème avec Swift 1.2. Voir Comment empêcher les bibliothèques SwiftSupport d'être incluses deux fois pour ma question initiale sur ce même problème.
Je suis presque sûr qu'il s'agit d'un problème de chaîne d'outils.
la source