Après le passage à Xcode 7, la taille de l'application est passée de 9 Mo à 60 Mo, y a-t-il un correctif?

96

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 .ipacréé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.
Blixt
la source
4
Xcode 7 utilise le découpage des applications, la taille du téléchargement sera probablement différente, elle diminuera probablement même. Je ne m'en soucierais pas.
Adam le
6
@Adam: Ce n'est pas le cas. La version déployée varie en fonction de l'appareil, mais jusqu'à présent, j'ai vu 30 Mo sur l'iPhone 5s et 60 Mo sur l'iPhone 6. Les temps d'installation ont sensiblement augmenté. C'est définitivement quelque chose dont il faut s'inquiéter lorsqu'il était de 9 Mo.
Blixt du
3
En fait, la différence de 30 contre 60 Mo est probablement due au fait que l'iPhone 5s est sur iOS 9.1 et l'iPhone 6 sur iOS 8. Mais même si tous les utilisateurs de l'application sont passés à iOS 9, 30 Mo représentent toujours une très forte augmentation par rapport à 9. MB.
Blixt
2
Avez-vous déployé via TestFlight? L'amincissement de l'application se fait sur les serveurs Apple, donc à moins que vous n'installiez via TestFlight / iTunes, vous ne pourrez pas voir la taille réduite, je pense.
MirekE
2
Après le téléchargement sur TestFlight, la taille de mon application est passée de 74 Mo à 9,6 Mo, alors ne vous inquiétez pas
Gintama

Réponses:

27

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.

David Rothera
la source
J'ai confirmé que la taille de téléchargement de l'application depuis Apple TestFlight était de 30 à 60 Mo au lieu de 9 Mo. Je ne pense pas que cela changera une fois qu'il sera sur l'App Store, car ils utilisent probablement le même mécanisme de distribution. Je vais essayer de désactiver Bitcode.
Blixt le
La désactivation des symboles Bitcode et de débogage dans les étapes de construction et de publication et l'archivage d'une version de construction incluent toujours exactement les deux libswiftCore.dylibfichiers à ~ 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.
Blixt
1
Je pars juste de mon expérience personnelle, mes .xcarchive sont BEAUCOUP plus grandes maintenant que pré-Xcode7, mais le téléchargement de l'App Store est toujours de la même taille, sinon légèrement plus petit en raison de la réduction des ressources, etc.
David Rothera
10
En regardant maintenant, le bundle de TestFlight était de 33 Mo et pour la même version sur l'AppStore, il est de 10,5 Mo, cela montre que l'amincissement n'est pas effectué sur les versions de TestFlight.
David Rothera
Ok, c'est bon à savoir. Je vais exécuter l'application sur l'App Store et j'espère que tout ira pour le mieux!
Blixt
19

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.

Blixt
la source
11

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.

Rick Ballard
la source
6

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.

Nuray Altin
la source
1
Cela ne signifie-t-il pas que vous n'obtiendrez pas de rapports d'erreur symbolisés?
Iulian Onofrei