Влияние параметров сборки Xcode «Включить битовый код» Да / Нет

239

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

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

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

Xcode информирует вас о биткомоде

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

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

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

Ответы:

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

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

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

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

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

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

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

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

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

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

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

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

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

Джеффри Томас
источник
19
«Apple создаст отдельные версии вашего приложения для каждой архитектуры компьютера (arm6 / arm7 / arm7s / arm64) вместо одного приложения с толстым двоичным файлом. Это означает, что приложение, установленное на устройствах iOS, будет меньше». Это то, что делает нарезка. Это не связано с биткодом.
user102008
10
«Опция ENABLE_BITCODE исключает этот последний шаг». Это не вырезать ни одного шага. Все двоичные файлы архитектуры все еще производятся. Информация о битовом коде PLUS добавляется для КАЖДОЙ архитектуры. См stackoverflow.com/a/31030741/102008
user102008
6
См developer.apple.com/library/prerelease/watchos/documentation/... «Нарезка это процесс создания и доставки вариантов приложения пачки для различных целевых устройств. Вариант содержит только исполняемую архитектуру и ресурсы, которые необходимы для цели устройство «.
user102008
7
Неверно утверждать, что включение Bitcode сделает приложение, установленное на устройстве, меньше по сравнению с тем, когда Bitcode отключен. Нигде так не сказано.
user102008
7
@ onmyway133 Не все поставщики предоставляют источник. Если все, что предоставляет поставщик, - это статическая библиотека и файлы заголовков (или Framework), то поставщику необходимо скомпилировать свои материалы с включенным бит-кодом.
Джеффри Томас
65

Убедитесь, что вы выбрали «Все», чтобы найти настройки сборки битового кода:

Настройки сборки

Гамма-Point
источник
35

Биткод - новая функция iOS 9

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

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

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

AGY
источник
«Оптимизируйте бинарный файл вашего приложения в будущем» - можете ли вы объяснить немного больше?
genaks
Здесь говорится, что: «Биткод - новая функция iOS 9» и что «[...] Для приложений watchOS требуется [...] биткод». Итак, что если я хотел бы создать приложение WatchOS под iOS 8?
суперпуччо
33

Биткод затрудняет создание отчетов о сбоях . Вот цитата из HockeyApp (что также верно для любого другого решениям для отчетов о ):

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

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

Александр Васенин
источник
2
Между сентябрем и декабрем это удалось исправить с помощью новой опции экспорта Xcode Organizer (см. Обновление в цитируемом HA-руководстве) и снова сломали (см. Мой решенный вопрос о HA )
Павел Зденек
13

@ vj9 спасибо Я обновляю до xcode 7. Это показывает мне ту же ошибку. Строй хорошо после набора "НЕТ"

введите описание изображения здесь

установите «НЕТ», это работает хорошо.

введите описание изображения здесь

zszen
источник
1
@Septronic Если вы хотите выбрать ДА. Вы должны проверить, что все ваши третьи рамки поддерживают это.
zszen
Ваша целевая минимальная поддерживаемая версия iOS должна быть iOS 6 или выше.
ShallowThought
9

Здесь вы можете найти все решения, касающиеся биткода

Согласно Apple Doc

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

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

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

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

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

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

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

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

Rex
источник
6

Из документов

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

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

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

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

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

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

Не должно быть никаких воздействий на производительность.

vj9
источник