Влияние параметров сборки Xcode "Включить битовый код" Да / Нет
Вчера я узнал массу предупреждений о библиотеке parse.com:
СРОЧНО: весь битовый код будет удален, потому что '[path]/Parse.framework/Parse(PFAnalytics.o)' был создан без битового кода. Вы должны перестроить его с включенным битовым кодом (настройка Xcode ENABLE_BITCODE), получить обновленную библиотеку от поставщика или отключить битовый код для этой цели. Примечание: это будет ошибкой в будущем.
Мне известно о том, что я могу удалить эти предупреждения с помощью этого ответа, но теперь мне интересно, окажет ли это какое-либо негативное влияние на представление в AppStore и / или на фактическую производительность моего приложения.
Xcode информирует вас о биткомоде
Активация этого параметра означает, что цель или проект должны генерировать битовый код во время компиляции для платформ и архитектур, которые его поддерживают. Для сборок архива битовый код будет сгенерирован в связанном двоичном файле для отправки в магазин приложений. Для других сборок компилятор и компоновщик проверят, соответствует ли код требованиям генерации битового кода, но не будут генерировать фактический битовый код. [ENABLE_BITCODE]
Но я не получаю никакой полезной информации из этого текста.
- Могу ли я использовать связанный ответ, чтобы обойти проблему без каких-либо негативных последствий и без ущерба для будущей отправки в AppStore?
- Что это
ENABLE_BITCODE
на самом деле, будет ли это необязательным требованием в будущем? - Есть ли какие-либо воздействия на производительность, если я включаю / отключаю его?
10 ответов
- Что на самом деле делает ENABLE_BITCODE, будет ли это необязательным требованием в будущем?
Я не уверен, на каком уровне вы ищете ответ, поэтому давайте отправимся в небольшое путешествие. Некоторые из этого вы, возможно, уже знаете.
Когда вы строите свой проект, Xcode вызывает clang
для целей Objective-C и swift
/swiftc
для стремительных целей. Оба этих компилятора компилируют приложение в промежуточное представление (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.
Биткод - новая функция iOS 9
Биткод - это промежуточное представление скомпилированной программы. Приложения, которые вы загружаете в iTunes Connect и содержат битовый код, будут скомпилированы и связаны в App Store. Включение битового кода позволит Apple повторно оптимизировать двоичный файл вашего приложения в будущем без необходимости представлять новую версию вашего приложения в магазине.
Примечание. Для приложений iOS битовый код используется по умолчанию, но не является обязательным. Если вы предоставляете битовый код, все приложения и платформы в комплекте приложений должны включать битовый код. Для приложений WatchOS требуется битовый код
Таким образом, вы должны отключить битовый код, пока все фреймворки вашего приложения не включат битовый код.
Биткод затрудняет создание отчетов о сбоях. Вот цитата из HockeyApp (которая также относится к любым другим решениям для отчетов о сбоях):
Когда вы загружаете приложение в App Store и оставляете флажок "Bitcode" включенным, Apple будет использовать эту сборку Bitcode и перекомпилировать ее на своем конце, прежде чем распространять на устройства. Это приведет к тому, что двоичный файл получит новый UUID, и есть возможность загрузить соответствующий dSYM через XCode.
Примечание: ответ был отредактирован в январе 2016 года, чтобы отразить последние изменения
Биткод устарел из XCode 14 Beta:
https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes
Начиная с Xcode 14, биткод больше не требуется для приложений watchOS и tvOS, а App Store больше не принимает биткоды от Xcode 14.
Xcode больше не создает битовый код по умолчанию и генерирует предупреждающее сообщение, если проект явно включает битовый код: «Сборка с битовым кодом устарела. Пожалуйста, обновите настройки вашего проекта и/или цели, чтобы отключить биткод». Возможность сборки с биткодом будет удалена в будущем выпуске Xcode. IPA, содержащие битовый код, будут удалены перед отправкой в App Store. Символы отладки для прошлых представлений битового кода остаются доступными для загрузки. (86118779)
Всем, кто интересуется биткодом, кажется, что в нем больше нет необходимости.
@vj9 спасибо Я обновляю до xcode 7 . Это показывает мне ту же ошибку. Строй хорошо после набора "НЕТ"
установите "НЕТ", это работает хорошо.
Здесь вы можете найти все решения, касающиеся биткода
Согласно 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 предоставляет сервис отчетов о сбоях, который может играть роль отладчика, при условии, что разработчик загрузил символы отладки во время публикации приложения. Тот факт, что разработчик никогда не видит точный двоичный код, означает, что он может не иметь возможности проверять конкретные проблемы по мере развития нового оборудования. Есть также некоторые опасения по поводу передачи полномочий Apple на выполнение компиляции - в том числе возможность вставлять дополнительные подпрограммы или фрагменты кода - но, поскольку Apple полностью контролирует процесс публикации, в настоящее время это возможно, независимо от того, использует ли разработчик битовый код или скомпилированные двоичные файлы.,
Наконец, битовый код на сервере может быть переведен для поддержки новых архитектур и наборов команд по мере их развития. При условии, что они поддерживают соглашение о вызовах и размер выравнивания и слов, приложение битового кода может быть преобразовано в различные типы архитектуры и оптимизировано специально для нового процессора. Если используются стандартные библиотеки для математических и векторных подпрограмм, они могут быть оптимизированы под специфичные для процессора векторные инструкции для достижения максимальной производительности для данного приложения. Оптимизаторы могут даже генерировать несколько разных кодировок и оценивать их по размеру или скорости выполнения.
Для получения дополнительной информации, пожалуйста, проверьте здесь и здесь
Из документов
- Могу ли я использовать вышеуказанный метод без каких-либо негативных последствий и без ущерба для будущей отправки в магазин приложений?
Биткод позволит Apple оптимизировать приложение, не отправляя другую сборку. Но вы можете включить эту функцию только в том случае, если эта функция включена во всех платформах и приложениях в комплекте приложений. Наличие этого помогает, но отсутствие его не должно иметь никакого отрицательного воздействия.
- Что на самом деле делает ENABLE_BITCODE, будет ли это необязательным требованием в будущем?
Для приложений iOS битовый код используется по умолчанию, но не является обязательным. Если вы предоставляете битовый код, все приложения и платформы в комплекте приложений должны включать битовый код. Для приложений watchOS требуется битовый код.
- Есть ли какие-либо воздействия на производительность, если я включаю / отключаю его?
App Store и операционная система оптимизируют установку приложений iOS и watchOS, приспосабливая доставку приложений к возможностям конкретного устройства пользователя с минимальными затратами. Эта оптимизация, называемая прореживанием приложений, позволяет создавать приложения, использующие большинство функций устройства, занимающие минимальное дисковое пространство и адаптируемые для будущих обновлений, которые могут применяться Apple. Более быстрая загрузка и больше места для других приложений и контента обеспечивает лучшее взаимодействие с пользователем.
Не должно быть никаких воздействий на производительность.
- Начиная с Xcode 14, биткод больше не требуется для приложений watchOS и tvOS, а App Store больше не принимает биткоды от Xcode 14.
- Xcode больше не создает битовый код по умолчанию и генерирует предупреждающее сообщение, если проект явно включает битовый код: «Сборка с битовым кодом устарела. Пожалуйста, обновите настройки вашего проекта и/или цели, чтобы отключить биткод». Возможность сборки с биткодом будет удалена в будущем выпуске Xcode. IPA, содержащие битовый код, будут удалены перед отправкой в AppStore. Символы отладки можно загрузить только из App Store Connect /TestFlight для существующих отправок битового кода, и они больше не доступны для отправок, сделанных с помощью Xcode 14. (86118779)
Могу ли я использовать связанный ответ, чтобы обойти проблему без каких-либо негативных последствий и без ущерба для будущей отправки в AppStore?
да
Что на самом деле делает ENABLE_BITCODE, будет ли это необязательным требованием в будущем?
ENABLE_BITCODE
добавляет промежуточное представление вашего кода в двоичный файл. Для watchOS, tvOS теперь обязательно
Будет ли какое-либо влияние на производительность, если я включу / отключу его?
Это влияет на сборку Xcode и объем памяти, когда вы архивируете свой проект.