После перехода на Xcode 7 размер приложения вырос с 9 МБ до 60 МБ, есть ли исправление?

Я вернулся в историю Git, чтобы найти причину изменения размера большого количества файлов, но единственной реальной причиной, которую я могу найти, является переход от Xcode 6 к Xcode 7 GM.

Я обнаружил, что это 10 лучших участников в размере .ipa, созданных в результате операции Архива в конфигурации сборки выпуска:

$ 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

На сегодняшний день самыми большими файлами являются два (несколько разных) libswiftCore.dylib файлов, которые составляют более 32 МБ. В комплекте, построенном Xcode 6, эти два файла составляли всего 3 МБ.

Итак, вопрос № 1: Почему файлы Swift ядра там дважды? ( Вложенное содержимое содержит Swift Code установлено значение Нет).

И вопрос № 2: что случилось? Почему размер ядра Swift увеличился на 15 МБ? Это постоянный?

Некоторые дополнительные примечания:

  • Это проект, который был полностью Objective-C, но теперь в основном Swift. Для параметра Определить модуль установлено значение Да.
  • В проекте используются CocoaPods с use_frameworks!.
  • Я подтвердил фактический размер загрузки из TestFlight на нескольких устройствах и версиях iOS и в диапазоне 30-60 МБ (предположительно, разница связана с наложением приложений). Это было 9 МБ.

Ответ 1

Скорее всего, вызванный BitCode, я видел тот же рост, однако после его развертывания из App Store размер приложения фактически не вырос.

Вы можете отключить BitCode и в своем приложении, и в других целях, и вы должны увидеть усадку.

Ответ 2

Я тестировал множество настроек и комбинаций, и кажется, что размер файлов пакетов, созданных Xcode 7, сильно варьируется в зависимости от устройства и версии iOS. Кроме того, сборки TestFlight теперь огромны по сравнению с предыдущими, но хорошая новость заключается в том, что когда-то в App Store не было огромного увеличения (хотя я вижу около 1-2 МБ, добавленных к размеру пакета по сравнению с предыдущим).

Вот несколько примеров, чтобы показать разницу между TestFlight, магазином приложений и устройствами:

TestFlight, iPhone 5s на iOS 9.1
35.6 МБ

TestFlight, iPhone 6 на iOS 8.4.1
70,1 МБ

Магазин приложений
11.8 МБ

Размер App Store был идентичен для всех тестируемых устройств. Я не тестировал его на iPhone 6 Plus, но очень вероятно, что размер пакета будет больше, поскольку он использует активы @3x.

Ответ 3

Ожидается, что размер быстрых dylib и ваш собственный код будет значительно больше в .xcarchive, и когда вы экспортируете дистрибутив хранилища, из-за включения битового кода. Этот дополнительный размер не будет отражен в том, что фактически доставляется вашим пользователям, поэтому это не должно быть проблемой. Когда вы отправляете свое приложение в магазин, хранилище будет обрабатывать его, чтобы вырезать биткод, и эта обработанная версия IPA - это то, что будут загружать ваши пользователи.

Если вы делаете какой-либо экспорт из своего архива, кроме экспорта магазина (например, для развертывания ad-hoc), мы локально вычеркиваем бит-код (и даже сначала перекомпилируем ваши двоичные файлы из битового кода, если вы оставите этот параметр отмеченным в рабочем процессе экспорта, чтобы воссоздать, что произойдет в магазине), чтобы вы могли видеть, насколько на самом деле будет ваше приложение. TestFlight также вырезает для вас биткод и покажет вам ваш истинный размер приложения.

Вы также должны знать, что размер вашего приложения также можно уменьшить с помощью прореживания приложения, о котором вы можете прочитать в https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html. Вероятно, вы захотите выполнить экспорт ad-hoc, чтобы увидеть размер каждого утонченного варианта вашего приложения.

Ответ 4

Введенный биткод является причиной.

Предполагая, что вы не хотите отключать ENABLE_BITCODE, вы можете удалить символы отладки.

См. http://oguzbastemur.blogspot.com/2015/09/xcode-7-and-increaded-binary-size.html в качестве удаления отладочных символов перед тем, как вставлять биткод - это один из вариантов, который вы можете сделать.