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

96

Я возвращался в историю 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, установлено значение Нет ).

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

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

  • Это проект, который полностью был Objective-C, но теперь в основном Swift. Для параметра " Определяет модуль" установлено значение " Да" .
  • В проекте используются CocoaPods с use_frameworks!set.
  • Я подтвердил фактический размер загрузки из TestFlight на нескольких устройствах и версиях iOS, и он находится в диапазоне 30–60 МБ (вероятно, разница связана с нарезкой приложений). Раньше было 9 МБ.
Blixt
источник
4
Xcode 7 использует нарезку приложений, размер загрузки, скорее всего, будет другим, возможно, даже уменьшится. Я бы не стал об этом беспокоиться.
Адам
6
@ Адам: Это не так. Развернутая версия зависит от устройства, но до сих пор я видел 30 МБ на iPhone 5s и 60 МБ на iPhone 6. Время установки заметно увеличилось. Это определенно повод для беспокойства, когда раньше было 9 МБ.
Blixt
3
На самом деле разница в 30 и 60 МБ, скорее всего, связана с тем, что iPhone 5s находится на iOS 9.1, а iPhone 6 - на iOS 8. Но даже если все пользователи приложений обновятся до iOS 9, 30 МБ по-прежнему будут очень большим увеличением по сравнению с 9. МБ.
Blixt
2
Вы развертывали через TestFlight? Прореживание приложения выполняется на серверах Apple, поэтому, если вы не установите его через TestFlight / iTunes, я думаю, вы не сможете увидеть уменьшенный размер.
MirekE
2
После загрузки в TestFlight размер моего приложения уменьшился с 74 МБ до 9,6 МБ, так что не волнуйтесь,
Джинтама

Ответы:

27

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

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

Дэвид Ротера
источник
Я подтвердил, что размер загружаемого приложения из Apple TestFlight составляет от 30 до 60 МБ вместо 9 МБ. Я не думаю, что он изменится, когда он появится в App Store, поскольку они предположительно используют один и тот же механизм распространения. Попробую отключить Bitcode.
Blixt
Отключение Bitcode и Debug Symbols на этапах сборки и публикации и архивирование версии сборки по-прежнему включает в себя те же два libswiftCore.dylibфайла размером ~ 40 МБ каждый (~ 16 МБ в сжатом виде). Я не подтвердил полное развертывание через TestFlight, но поскольку эти огромные файлы все еще являются частью .ipa, я сомневаюсь, что их вклад в размер файла изменится. Общий размер уменьшился примерно на 10 МБ, что, по-видимому, в основном связано с отсутствием поддержки символов сбоя.
Blixt
1
Я просто исхожу из личного опыта, мои .xcarchive сейчас НАМНОГО больше, чем до Xcode7, однако загрузка магазина приложений по-прежнему того же размера, если не немного меньше из-за истощения ресурсов и т. Д.
Дэвид Ротера
10
Просто посмотрите, пакет от TestFlight был 33 МБ, а для той же сборки в AppStore это 10,5 МБ, это показывает, что прореживание не выполняется в сборках TestFlight.
Дэвид Ротера
Хорошо, это хорошо знать. Я запустил приложение в App Store и надеюсь на лучшее!
Blixt
19

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

Вот несколько примеров, демонстрирующих различия между TestFlight, App Store и устройствами:

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.

Blixt
источник
11

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

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

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

Рик Баллард
источник
6

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

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

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

Нурай Алтын
источник
1
Разве это не значит, что вы не будете получать символьные отчеты о сбоях?
Юлиан