Влияние параметров сборки Xcode "включить bitcode" Да / нет

вчера я узнал тонну предупреждений относительно parse.com библиотека:

срочно: весь биткод будет удален, потому что ' [path] / Parse.framework / Parse (PFAnalytics.o) ' был построен без bitcode. Вы должны перестроить его с включенным bitcode (Xcode setting ENABLE_BITCODE), получить обновленную библиотеку от поставщика или отключить bitcode для этой цели. Примечание: это будет ошибкой в будущем.

Я знаю о том, что я могу удалить эти предупреждения с ответ но теперь мне интересно, будет ли это иметь какое-либо негативное влияние в отношении представления AppStore и / или фактической производительности моего приложения.

Xcode сообщает вам о bitcode

активация этого параметра указывает, что цель или проект должны генерировать bitcode во время компиляции для платформ и архитектур, которые ее поддерживают. Для архивных построений биткод будет создан в связанном двоичном файле для отправки в магазин app Store. Для других сборок компилятор и компоновщик проверят, соответствует ли код требованиям для генерации bitcode, но не будет генерировать фактический bitcode. [ENABLE_BITCODE]

но я не получаю никакой действительно полезной информации из этого текста.

  • могу ли я использовать связанный ответ, чтобы обойти проблему без каких-либо негативных последствий и без ущерба для будущего представления AppStore?
  • что значит ENABLE_BITCODE на самом деле, будет ли это необязательным требованием в будущем?
  • есть ли какие-либо последствия для производительности, если я включу / отключу его?

7 ответов


  • что на самом деле делает ENABLE_BITCODE, будет ли это необязательным требованием в будущем?

Я не уверен, на каком уровне вы ищете ответ, поэтому давайте совершим небольшое путешествие. Некоторые из этого вы уже знаете.

когда вы создаете свой проект, Xcode вызывает clang для целей Objective-C и swift/swiftc для быстрой цели. Оба этих компилятора компилируют приложение в промежуточный представление (IR), один из этих IRs является bitcode. Из этого ИК программа под названием LLVM берет на себя и создает двоичные файлы, необходимые для x86 32 и 64-битных режимов (для симулятора) и arm6/arm7/arm7s/arm64 (для устройства). Обычно все эти разные двоичные файлы объединяются в один файл под названием fat binary.

опция ENABLE_BITCODE вырезает этот последний шаг. Он создает версию приложения с двоичным кодом IR bitcode. Это имеет ряд хорошие функции, но один гигантский недостаток: он не может работать нигде. Чтобы запустить приложение с двоичным битовым кодом, битовый код необходимо перекомпилировать (может быть, собраны или перекодированы... я не уверен в правильном глаголе) в двоичный файл x86 или ARM.

когда приложение bitcode будет отправлено в App Store, Apple сделает этот последний шаг и создаст готовые двоичные файлы.

прямо сейчас приложения bitcode являются необязательными, но история показала, что Apple превращает необязательные вещи в требования (например, поддержка 64 бит). Обычно это занимает несколько лет, поэтому сторонние разработчики (например, Parse) имеют время для обновления.

  • могу ли я использовать вышеуказанный метод без каких-либо негативных последствий и без ущерба для будущего представления appstore?

Да, вы можете отключить ENABLE_BITCODE, и все будет работать так же, как раньше. Пока Apple не сделает bitcode apps требованием для App Store, вы будете штраф.

  • есть ли какие-либо последствия для производительности, если я включу / отключу его?

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

что касается положительных воздействий ... ну, это сложно.

для распространения в App Store Apple создаст отдельные версии вашего приложения для каждой архитектуры компьютера (arm6 / arm7 / arm7s / arm64) вместо одного приложения с жирным двоичным кодом. Это означает, что приложение, установленное на iOS-устройствах будет меньше.

кроме того, при перекомпиляции bitcode (может быть, собраны или перекодированы... опять же, я не уверен в правильном глаголе), он оптимизирован. LLVM всегда работает над созданием новых лучших оптимизаций. Теоретически App Store может воссоздавать отдельную версию приложения в App Store с каждым новым выпуском LLVM, поэтому ваше приложение может быть re-оптимизированный с самой последней технологией LLVM.


обязательно выберите "все", чтобы найти настройки сборки включить bitcode:

Build settings


Bitcode-это новая функция iOS 9

Bitcode является промежуточным представлением скомпилированной программы. Приложения, загруженные в iTunes Connect и содержащие биткод, будут скомпилированы и связаны в App Store. Включение bitcode позволит Apple повторно оптимизировать двоичный файл приложения в будущем без необходимости отправки новой версии вашего приложения в магазин.

Примечание: для приложений iOS по умолчанию используется bitcode, но необязательно. Если вы предоставляете bitcode, все приложения и фреймворки в пакете приложений должны включать bitcode. Для watchOS приложений, bitcode требуется

поэтому вы должны отключить bitcode, пока все фреймворки вашего приложения не будут включены bitcode.


Bitcode делает отчет о сбоях сложнее. Вот цитата из HockeyApp (что также относится к другие crash reporting solutions):

при загрузке приложения в App Store и оставлении флажка "Bitcode" включенным, Apple будет использовать эту сборку Bitcode и повторно скомпилировать ее на своем конце, прежде чем распространять ее на устройства. Это приведет к тому, что двоичный файл получит новый UUID, и есть возможность загрузить соответствующий dSYM через Xcode.

Примечание: ответ был отредактирован в январе 2016 года, чтобы отразить самые последние изменения


@vj9 thx. Я обновляю до xcode 7 . Он показывает мне ту же ошибку. Построить хорошо после набора "нет"

enter image description here

установите "нет", он работает хорошо.

enter image description here


здесь вы можете найти все решения в отношении Bitcode

согласно Apple Doc

Bitcode является промежуточным представлением скомпилированной программы. Приложения, загруженные в iTunes Connect и содержащие биткод, будут скомпилированы и связаны в магазине. Включение bitcode позволит Apple повторно оптимизировать двоичный файл приложения в будущем без необходимости отправки новой версии вашего приложения в магазин.

в Xcode скрывает символы, созданные во время сборки по умолчанию, поэтому они не читаются Apple. Только если вы решите включить символы при загрузке приложения в iTunes Connect, символы будут отправлены в Apple. Необходимо включить символы для получения отчетов о сбоях от Apple.

Примечание: для приложений iOS по умолчанию используется bitcode, но необязательно. Для watchOS и tvOS приложений, bitcode требуется. Если вы предоставляете bitcode, все приложения и фреймворки в пакете приложений (все цели в проекте) необходимо включить bitcode. После распространения приложения с помощью iTunes Connect можно загрузить файл dSYMs для сборки, описанный в разделе просмотр и импорт сбоев в окне устройства

первоначальное развертывание службы битового кода и истончения приложений Apple было приостановлено, поскольку проблемы при обновлении с одного типа оборудования на другой тип оборудования не восстановили правильные версии двоичных файлов. Эта проблема была впоследствии исправлена с iOS 9.0.2 и функция повторного включения.

Bitcode всегда был частью этапов компиляции и оптимизации LLVM, но, перемещая логику back-end на серверы Apple, он перемещает фазы оптимизации и сборки от времени компиляции разработчика до развертывания App Store. Это открывает потенциал будущей повторной оптимизации или повторного перевода для поддержки новых и более быстрых процессоров в будущем. Развертывания Bitcode необходимы для watchOS и tvOS deploments и могут быть условно включены для существующие развертывания iOS с опцией "включить Bitcode" в настройках проекта. Это добавит флаг embed-bitcode-marker для отладочных сборок и embed-bitcode для архивных / устройств. Они могут быть переданы компилятору Swift с-embed-bitcode или с помощью clang с-fembed-bitcode.

Bitcode также имеет некоторые недостатки. разработчики могут отлаживать отчеты о сбоях из приложений, сохраняя копии отладочных символов, соответствующих двоичному файлу, который был отправлен в Apple. Когда сбой происходит в данном стеке, разработчик может восстановить исходную трассировку стека, обозначив отчет о сбое с помощью этих отладочных символов. Однако символы являются побочным продуктом перевода промежуточной формы в двоичный файл; но если этот шаг выполняется на сервере, эта информация теряется. Apple предоставляет службу отчетов о сбоях, которая может играть роль отладчика при условии, что разработчик загрузил символы отладки во время применения публикация. Тот факт, что разработчик никогда не видит точный двоичный файл, означает, что они не смогут тестировать конкретные проблемы по мере развития нового оборудования. Существуют также некоторые опасения по поводу передачи Apple полномочий на выполнение компиляции – включая возможность вводить дополнительные процедуры или фрагменты кода, но поскольку Apple полностью контролирует процесс публикации, в настоящее время они возможны независимо от того, использует ли разработчик биткод или скомпилированные двоичные файлы.

наконец, в биткода на сервере можно перевести для поддержки новых архитектур и наборов инструкций по мере их развития. При условии, что они поддерживают соглашение о вызове и размер выравнивания и слов, приложение bitcode может быть переведено на другие типы архитектуры и оптимизировано специально для нового процессора. Если используются стандартные библиотеки для математических и векторных процедур, они могут быть оптимизированы в конкретные векторные инструкции процессора, чтобы получить лучшую производительность для данного приложение. Оптимизаторы могут даже генерировать несколько различных кодировок и судить на основе размера или скорости выполнения.

для получения дополнительной информации, пожалуйста, проверьте здесь и здесь


с docs

  • могу ли я использовать вышеуказанный метод без каких-либо негативных последствий и без ущерба для будущего представления appstore?

Bitcode позволит apple оптимизировать приложение без необходимости отправки другой сборки. Но вы можете включить эту функцию, только если эта функция включена во всех фреймворках и приложениях в пакете приложений. Иметь его помогает, Но не иметь его не должно иметь никакого негатива влияние.

  • что на самом деле делает ENABLE_BITCODE, будет ли это необязательным требованием в будущем?

для приложений iOS по умолчанию используется bitcode, но необязательно. Если вы предоставляете bitcode, все приложения и фреймворки в пакете приложений должны включать биткод. Для приложений watchOS требуется bitcode.

  • есть ли какие-либо последствия для производительности, если я включу / отключу его?

App Store и операционная система оптимизирует установку iOS и watchOS apps, адаптируя доставку приложений к возможностям прибор потребителя определенный, с минимальным следом ноги. Эта оптимизация, называется приложение истончение, позволяет создавать приложения, которые используют большинство устройств особенности, занимают минимальное дисковое пространство и приспосабливают будущие обновления это может быть применено Apple. Более быстрые загрузки и больше космоса для другие приложения и контент обеспечивают лучший пользовательский интерфейс.

там не должно быть никакого влияния на производительность.