Po przejściu na Xcode 7 rozmiar aplikacji wzrósł z 9 MB do 60 MB, czy jest jakieś rozwiązanie?

96

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 .ipautworzonym 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.dylibpliki, 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.
Blixt
źródło
4
Xcode 7 korzysta z krojenia aplikacji, rozmiar pobierania najprawdopodobniej będzie inny, prawdopodobnie nawet się zmniejszy. Nie martwiłbym się tym.
Adam
6
@Adam: Tak nie jest. Wdrożona wersja różni się w zależności od urządzenia, ale do tej pory widziałem 30 MB na iPhonie 5s i 60 MB na iPhonie 6. Czas instalacji wyraźnie się wydłużył. Jest to zdecydowanie coś, o co należy się martwić, gdy zajmowało 9 MB.
Blixt
3
W rzeczywistości różnica między 30 a 60 MB jest najprawdopodobniej spowodowana tym, że iPhone 5s jest na iOS 9.1, a iPhone 6 na iOS 8. Ale nawet jeśli wszyscy użytkownicy aplikacji zaktualizowali iOS 9, 30 MB to nadal bardzo duży wzrost z 9 MB.
Blixt
2
Czy wdrożyłeś za pośrednictwem TestFlight? Rozcieńczanie aplikacji odbywa się na serwerach Apple, więc myślę, że jeśli nie zainstalujesz za pośrednictwem TestFlight / iTunes, nie będziesz w stanie zobaczyć zmniejszonego rozmiaru.
MirekE
2
Po przesłaniu do TestFlight rozmiar mojej aplikacji zmniejszył się z 74 MB do 9,6 MB, więc nie martw się
Gintama

Odpowiedzi:

27

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ę.

David Rothera
źródło
Potwierdziłem, że rozmiar pobierania aplikacji z Apple TestFlight wynosi od 30 do 60 MB zamiast 9 MB. Nie sądzę, żeby to się zmieniło, gdy pojawi się w App Store, ponieważ prawdopodobnie używają tego samego mechanizmu dystrybucji. Spróbuję wyłączyć Bitcode.
Blixt
Wyłączenie symboli kodu bitowego i debugowania w krokach kompilacji i publikowania oraz archiwizacja wersji kompilacji nadal obejmuje dokładnie te same dwa libswiftCore.dylibpliki 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.
Blixt
1
Po prostu odchodzę od osobistych doświadczeń, moje .xcarchive są teraz DUŻO większe niż przed Xcode7, jednak pobieranie ze sklepu z aplikacjami jest nadal tego samego rozmiaru, jeśli nie trochę mniejsze z powodu przerzedzania zasobów itp.
David Rothera
10
Patrząc teraz, pakiet z TestFlight miał 33 MB, a dla tej samej wersji w AppStore jest to 10,5 MB, co pokazuje, że przerzedzenie nie jest wykonywane w kompilacjach TestFlight.
David Rothera
Dobrze, dobrze wiedzieć. Uruchomię aplikację do App Store i mam nadzieję, że wszystko będzie dobrze!
Blixt,
19

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.

Blixt
źródło
11

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.

Rick Ballard
źródło
6

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ć.

Nuray Altin
źródło
1
Czy to nie oznacza, że ​​nie będziesz otrzymywać symbolicznych raportów o awariach?
Iulian Onofrei,