Cofałem się w historii Git, aby znaleźć przyczynę ogromnej zmiany rozmiaru pliku, ale jedynym prawdziwym powodem, jaki mogę znaleźć, jest przejście z Xcode 6 na Xcode 7 GM.
Odkryłem, że są to 10 największych współtwórców rozmiaru plików w .ipa
utworzonym z operacji archiwum w konfiguracji kompilacji wydania :
$ 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
Zdecydowanie największymi plikami są dwa (nieco różne) libswiftCore.dylib
pliki, które łącznie mają ponad 32 MB. W pakiecie zbudowanym przez Xcode 6 te dwa pliki miały łącznie tylko 3 MB.
Pytanie 1 brzmi: dlaczego pliki rdzenia Swift są tam dwa razy? ( Treść osadzona zawiera kod Swift ma wartość Nie ).
A pytanie nr 2 brzmi: Co się stało? Dlaczego rozmiar rdzenia Swift wzrósł o 15 MB? Czy to jest trwałe?
Dodatkowe uwagi:
- Jest to projekt, który był całkowicie Objective-C, ale teraz jest w większości Swift. Ustawienie Definiuje moduł jest ustawione na Tak .
- Projekt wykorzystuje CocoaPods z
use_frameworks!
zestawem. - Potwierdziłem rzeczywisty rozmiar pobierania z TestFlight na wielu urządzeniach i wersjach iOS i mieści się w zakresie 30–60 MB (prawdopodobnie różnica wynika z krojenia aplikacji). Kiedyś miał 9 MB.
Odpowiedzi:
Najprawdopodobniej spowodowane przez BitCode, widziałem ten sam wzrost, jednak po wdrożeniu z App Store rozmiar aplikacji w rzeczywistości nie urósł.
Możesz wyłączyć BitCode w swojej aplikacji i innych celach, a powinieneś zobaczyć kurczenie się.
źródło
libswiftCore.dylib
pliki po ~ 40 MB każdy (skompresowany ~ 16 MB). Nie potwierdziłem całego wdrożenia za pomocą TestFlight, ale ponieważ te ogromne pliki nadal są częścią .ipa, wątpię, że ich wkład w rozmiar pliku się zmieni. Całkowity rozmiar zmniejszył się o około ~ 10 MB, co prawdopodobnie wynika głównie z wyłączenia obsługi symboli awarii.Testowałem wiele ustawień i kombinacji i wydaje się, że rozmiar plików tworzonych przez Xcode 7 różni się bardzo w zależności od urządzenia i wersji iOS. Ponadto kompilacje TestFlight są teraz ogromne w porównaniu z poprzednimi wersjami, ale dobrą wiadomością jest to, że kiedyś w App Store nie było dużego wzrostu (chociaż widzę około 1-2 MB dodanego do rozmiaru pakietu w porównaniu do wcześniej) .
Oto kilka przykładów pokazujących różnice między TestFlight, App Store i urządzeniami:
TestFlight, iPhone 5s na iOS 9.1
35,6 MB
TestFlight, iPhone 6 z systemem iOS 8.4.1
70,1 MB
App Store
11,8 MB
Rozmiar App Store był identyczny na wszystkich testowanych urządzeniach. Nie testowałem tego na iPhonie 6 Plus, jest bardzo możliwe, że rozmiar pakietu byłby większy, ponieważ wykorzystuje zasoby @ 3x.
źródło
Oczekuje się, że rozmiar szybkich dylib i twojego własnego kodu będzie znacznie większy w .xcarchive i podczas eksportu do dystrybucji w sklepie, ze względu na włączenie bitcode. Ten dodatkowy rozmiar nie zostanie odzwierciedlony w tym, co faktycznie zostanie dostarczone Twoim użytkownikom, więc nie powinno to stanowić problemu. Po przesłaniu aplikacji do sklepu sklep przetworzy ją w celu usunięcia kodu bitowego, a użytkownicy będą pobierać tę przetworzoną wersję IPA.
Jeśli wykonasz dowolny rodzaj eksportu ze swojego archiwum, z wyjątkiem eksportu do sklepu (np. Zapisz do wdrożenia ad-hoc), lokalnie usuniemy kod bitowy (a nawet najpierw skompilujemy pliki binarne z kodu bitowego, jeśli pozostawisz tę opcję zaznaczoną w eksporcie przepływ pracy, aby odtworzyć to, co będzie się działo w sklepie), dzięki czemu możesz zobaczyć, jak duża będzie Twoja aplikacja. TestFlight usunie również kod bitcode i pokaże Twój prawdziwy rozmiar aplikacji.
Należy również mieć świadomość, że rozmiar aplikacji można również zmniejszyć poprzez uproszczenie aplikacji, o czym można przeczytać na stronie https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html . Prawdopodobnie i tak będziesz chciał wykonać eksport ad hoc, aby zobaczyć rozmiar każdego pocienionego wariantu aplikacji.
źródło
Przyczyną jest wbudowany Bitcode.
Zakładając, że nie chcesz wyłączać ENABLE_BITCODE, możesz usunąć symbole debugowania.
Zobacz http://oguzbastemur.blogspot.com/2015/09/xcode-7-and-increaded-binary-size.html, ponieważ usunięcie symboli debugowania przed osadzeniem bitcode jest jedną z opcji, które możesz zrobić.
źródło
Mieliśmy również ten problem w Swift 1.2. Zobacz Jak zapobiec dwukrotnemu dołączaniu bibliotek SwiftSupport, aby zapoznać się z moim pierwotnym pytaniem dotyczącym tego samego problemu.
Jestem prawie pewien, że jest to problem z łańcuchem narzędzi.
źródło