Nach dem Wechsel zu Xcode 7 stieg die App-Größe von 9 MB auf 60 MB. Gibt es eine Lösung?

96

Ich bin in der Git-Geschichte zurückgegangen, um die Ursache für eine enorme Änderung der Dateigröße zu finden, aber der einzige wirkliche Grund, den ich finden kann, ist der Wechsel von Xcode 6 zu Xcode 7 GM.

Ich habe festgestellt, dass dies die 10 wichtigsten Beiträge zur Dateigröße in einer .ipaaus dem Archiv erstellten Operation in einer Release- Build-Konfiguration sind:

$ 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

Bei weitem die größten Dateien sind die zwei (leicht unterschiedlichen) libswiftCore.dylibDateien, die insgesamt über 32 MB groß sind. In dem von Xcode 6 erstellten Bundle umfassten diese beiden Dateien nur 3 MB.

Frage 1 lautet also: Warum sind die Swift-Kerndateien dort zweimal? ( Eingebetteter Inhalt enthält Swift-Code ist auf Nein gesetzt ).

Und Frage 2 lautet: Was ist passiert? Warum hat sich die Swift-Kerngröße um 15 MB erhöht? Ist das dauerhaft?

Einige zusätzliche Hinweise:

  • Dies ist ein Projekt, das vollständig Objective-C war, jetzt aber größtenteils Swift ist. Die Einstellung Modul definieren ist auf Ja gesetzt .
  • Das Projekt verwendet CocoaPods mit use_frameworks!Set.
  • Ich habe die tatsächliche Downloadgröße von TestFlight auf mehreren Geräten und iOS-Versionen bestätigt und sie liegt im Bereich von 30 bis 60 MB (vermutlich ist der Unterschied auf das Schneiden von Apps zurückzuführen). Früher waren es 9 MB.
Blixt
quelle
4
Xcode 7 verwendet App Slicing. Die Downloadgröße wird höchstwahrscheinlich unterschiedlich sein und wahrscheinlich sogar abnehmen. Ich würde mir darüber keine Sorgen machen.
Adam
6
@ Adam: Das ist nicht der Fall. Die bereitgestellte Version variiert je nach Gerät, aber bisher habe ich 30 MB auf dem iPhone 5s und 60 MB auf dem iPhone 6 gesehen. Die Installationszeiten haben sich merklich erhöht. Dies ist definitiv ein Grund zur Sorge, wenn es früher 9 MB waren.
Blixt
3
Tatsächlich ist der Unterschied zwischen 30 und 60 MB höchstwahrscheinlich darauf zurückzuführen, dass das iPhone 5s auf iOS 9.1 und das iPhone 6 auf iOS 8 läuft. Aber selbst wenn alle App-Benutzer auf iOS 9 aktualisiert haben, sind 30 MB immer noch ein sehr großer Anstieg von 9 MB.
Blixt
2
Haben Sie über TestFlight bereitgestellt? Das Ausdünnen der App erfolgt auf Apple-Servern. Wenn Sie also nicht über TestFlight / iTunes installieren, können Sie die reduzierte Größe meiner Meinung nach nicht sehen.
MirekE
2
Nach dem Hochladen auf TestFlight hat sich meine App-Größe von 74 MB auf 9,6 MB verringert. Machen Sie sich also keine Sorgen
Gintama,

Antworten:

27

Höchstwahrscheinlich durch BitCode verursacht, habe ich das gleiche Wachstum gesehen, aber nach der Bereitstellung aus dem App Store ist die App-Größe nicht wirklich gewachsen.

Sie können BitCode auch in Ihrer App und den anderen Zielen deaktivieren, und Sie sollten eine Schrumpfung feststellen.

David Rothera
quelle
Ich habe bestätigt, dass die Download-Größe der App von Apple TestFlight 30 bis 60 MB statt 9 MB beträgt. Ich glaube nicht, dass sich dies ändern wird, wenn es im App Store ist, da sie vermutlich denselben Verteilungsmechanismus verwenden. Ich werde versuchen, Bitcode zu deaktivieren.
Blixt
Das Deaktivieren von Bitcode- und Debug-Symbolen in den Erstellungs- und Veröffentlichungsschritten und das Archivieren einer Build-Version umfasst weiterhin genau dieselben zwei libswiftCore.dylibDateien mit jeweils ~ 40 MB (~ 16 MB komprimiert). Ich habe die gesamte Bereitstellung nicht über TestFlight bestätigt, aber da diese riesigen Dateien immer noch Teil der .ipa sind, bezweifle ich, dass sich ihr Beitrag zur Dateigröße ändern wird. Die Gesamtgröße schrumpfte um ca. 10 MB, was vermutlich hauptsächlich auf die Unterstützung von Crash-Symbolen zurückzuführen ist.
Blixt
1
Ich mache nur persönliche Erfahrungen, meine .xcarchive's sind jetzt viel größer als vor Xcode7, aber der Download im App Store ist immer noch gleich groß, wenn auch nicht geringfügig kleiner, weil die Ressourcen dünner werden usw.
David Rothera
10
Im Moment war das Bundle von TestFlight 33 MB groß und für den gleichen Build im AppStore sind es 10,5 MB. Dies zeigt, dass die Ausdünnung bei TestFlight-Builds nicht erfolgt.
David Rothera
Okay, das ist gut zu wissen. Ich werde die App bis zum App Store laufen lassen und auf das Beste hoffen!
Blixt
19

Ich habe viele Einstellungen und Kombinationen getestet und es scheint, dass die Dateigröße der von Xcode 7 erstellten Bundles je nach Gerät und iOS-Version sehr unterschiedlich ist. Auch die TestFlight-Builds sind jetzt im Vergleich zu früher riesig, aber die gute Nachricht ist, dass es im App Store keinen großen Anstieg gab (obwohl ich sehe, dass die Bundle-Größe im Vergleich zu früher um 1–2 MB erweitert wurde). .

Hier einige Beispiele, um die Varianz zwischen TestFlight, App Store und Geräten zu zeigen:

TestFlight, iPhone 5s unter iOS 9.1
35,6 MB

TestFlight, iPhone 6 unter iOS 8.4.1
70,1 MB

App Store
11,8 MB

Die App Store-Größe war auf allen von mir getesteten Geräten identisch. Ich habe es jedoch nicht auf dem iPhone 6 Plus getestet. Es ist sehr wahrscheinlich, dass das Bundle größer ist, da es @ 3x Assets verwendet.

Blixt
quelle
11

Es wird erwartet, dass die Größe der schnellen Dylibs und Ihres eigenen Codes im .xcarchive und beim Exportieren für die Filialverteilung aufgrund der Einbeziehung von Bitcode erheblich größer ist. Diese zusätzliche Größe spiegelt sich nicht in dem wider, was tatsächlich an Ihre Benutzer geliefert wird, daher sollte dies kein Problem sein. Wenn Sie Ihre App an den Store senden, verarbeitet der Store sie, um den Bitcode zu entfernen, und diese verarbeitete Version des IPA wird von Ihren Benutzern heruntergeladen.

Wenn Sie einen Export aus Ihrem Archiv ausführen, mit Ausnahme eines Store-Exports (z. B. für Ad-hoc-Bereitstellung speichern), entfernen wir den Bitcode lokal (und kompilieren Ihre Binärdateien sogar zuerst aus dem Bitcode neu, wenn Sie diese Option beim Export aktiviert lassen Workflow, um neu zu erstellen, was im Store passieren wird), damit Sie sehen können, wie groß Ihre App tatsächlich sein wird. TestFlight entfernt auch den Bitcode für Sie und zeigt Ihnen Ihre wahre App-Größe.

Sie sollten sich auch darüber im Klaren sein, dass die Größe Ihrer App auch durch App-Ausdünnung reduziert werden kann, über die Sie unter lesen können https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html . Möglicherweise möchten Sie einen Ad-hoc-Export durchführen, um die Größe jeder verdünnten Variante Ihrer App zu ermitteln.

Rick Ballard
quelle