У меня проблема с термином встроенный битовый код.
Что такое встроенный битовый код?
Когда включить, ENABLE_BITCODE
в новом Xcode?
Что происходит с бинарным при включении ENABLE_BITCODE
в Xcode 7?
Бит-код относится к типу кода: «Бит-код LLVM», который отправляется в iTunes Connect. Это позволяет Apple использовать определенные расчеты для дальнейшей повторной оптимизации приложений (например: возможно уменьшить размеры исполняемых файлов). Если Apple нужно изменить ваш исполняемый файл, они могут сделать это без загрузки новой сборки.
Это отличается от: нарезки, которая представляет собой процесс Apple, оптимизирующий ваше приложение для устройства пользователя на основе разрешения и архитектуры устройства. Нарезка не требует биткода. (Пример: только включая @ 2x изображения на 5 с)
Разреживание приложений - это комбинация ресурсов нарезки, битового кода и ресурсов по требованию.
Биткод является промежуточным представлением скомпилированной программы. Приложения, загруженные в iTunes Connect и содержащие битовый код, будут скомпилированы и связаны в App Store. Включение битового кода позволит Apple повторно оптимизировать двоичный файл вашего приложения в будущем без необходимости отправлять новую версию вашего приложения в магазин.
Что такое встроенный битовый код?
Согласно документам :
Обновление: эта фраза в «Новые функции в Xcode 7» заставила меня долго думать, что для нарезки необходим биткод чтобы уменьшить размер приложения:
Однако это не так, битовый код и слайсинг работают независимо друг от друга: слайсинг - это уменьшение размера приложения и создание вариантов комплекта приложений, а также биткод - это определенные бинарные оптимизации. Я проверил это, проверив включенные архитектуры в исполняемых файлах приложений без битового кода и обнаружив, что они включают только необходимые.
Биткод позволяет другому компоненту Разбавления приложений нарезка для создания приложений сверток варианты с конкретными исполняемыми для конкретных архитектур, например , вариант iPhone 5S будет включать в себя только arm64 исполняемом, IPad Mini ARMv7 и так далее.Когда включить ENABLE_BITCODE в новом Xcode?
Что происходит с двоичным файлом, когда ENABLE_BITCODE включен в новом Xcode?
От ссылки Xcode 7:
Вот пара ссылок, которые помогут в более глубоком понимании биткода :
источник
Поскольку точный вопрос заключается в том, «что позволяет делать битовый код», я хотел бы привести несколько тонких технических деталей, которые я выяснил до сих пор. Большинство из них практически невозможно понять со 100% уверенностью, пока Apple не выпустит исходный код для этого компилятора
Во-первых, битовый код Apple не появляется , чтобы быть тем же самым , как LLVM байткод. По крайней мере, я не смог выяснить какое-либо сходство между ними. Кажется, что он имеет собственный заголовок (всегда начинается с «xar!») И, возможно, некоторую магию ссылок во время соединения, которая предотвращает дублирование данных. Если вы записываете жестко закодированную строку, эта строка будет помещена в данные только один раз, а не дважды, как ожидалось бы, если бы это был обычный байт-код LLVM.
Во-вторых, битовый код на самом деле не поставляется в двоичном архиве как отдельная архитектура, как можно было бы ожидать. Он поставляется не так, как, скажем, x86 и ARM помещены в один двоичный файл (архив FAT). Вместо этого они используют специальный раздел в специфичном для архитектуры бинарном файле MachO с именем «__LLVM», который поставляется с каждой поддерживаемой архитектурой (т. Е. Дублируется). Я предполагаю, что это недочёт в их системе компиляции и может быть исправлено в будущем, чтобы избежать дублирования.
Код C (скомпилирован с
clang -fembed-bitcode hi.c -S -emit-llvm
):ИК выход LLVM:
Массив данных, который находится в IR, также изменяется в зависимости от оптимизации и других настроек генерации кода в clang. Мне совершенно неизвестно, в каком формате или в каком-либо другом формате.
РЕДАКТИРОВАТЬ:
Следуя подсказке в Твиттере, я решил вернуться и подтвердить это. Я следил за этим сообщением в блоге и использовал его инструмент для извлечения бит-кода, чтобы извлечь двоичный файл Apple Archive из исполняемого файла MachO. И после распаковки Apple Archive с помощью утилиты xar, я получил это (конечно, преобразованный в текст с помощью llvm-dis)
Единственное заметное различие между IR без битового кода и IR с битовым кодом заключается в том, что имена файлов были сокращены до 1, 2 и т. Д. Для каждой архитектуры.
Я также подтвердил, что битовый код, встроенный в двоичный файл, генерируется после оптимизации. Если вы скомпилируете с -O3 и извлечете битовый код, он будет отличаться от того, если вы скомпилируете с -O0.
И только для того, чтобы получить дополнительный кредит, я также подтвердил, что Apple не отправляет битовый код на устройства при загрузке приложения для iOS 9. Они включают в себя ряд других странных разделов, которые я не распознал, например __LINKEDIT, но они не включают в себя пакет __LLVM .__ и, следовательно, не включают битовый код в окончательный двоичный файл, который выполняется на устройстве. Как ни странно, Apple все еще поставляет толстые двоичные файлы с отдельным 32/64-битным кодом на устройства iOS 8.
источник
xar!
это формат архивных файлов Apple.По сути, эта концепция чем-то похожа на Java, где байт-код запускается на разных JVM, и в этом случае битовый код помещается в хранилище iTune, и вместо передачи промежуточного кода на разные платформы (устройства) он предоставляет скомпилированный код, который не требуется. любая виртуальная машина для запуска.
Таким образом, нам нужно создать битовый код один раз, и он будет доступен для существующих или будущих устройств. Это головная боль Apple, чтобы сделать его совместимым с каждой имеющейся платформой.
Разработчикам не нужно вносить изменения и повторно отправлять приложение для поддержки новых платформ.
Давайте возьмем пример iPhone 5s, когда Apple ввела
x64
в него чип. Хотяx86
приложения были полностью совместимы сx64
архитектурой, но для полного использованияx64
платформы разработчик должен изменить архитектуру или некоторый код. После того, как он / она закончит, приложение отправляется в магазин приложений для проверки.Если эта концепция битового кода была запущена ранее, то мы, разработчики, не должны вносить какие-либо изменения для поддержки
x64
битовой архитектуры.источник
Обновить
Apple пояснила, что нарезка происходит независимо от включения битового кода. Я также наблюдал это на практике, когда приложение без поддержки битового кода будет загружаться только в соответствии с архитектурой, подходящей для целевого устройства.
оригинал
Более конкретно :
Как я понимаю, если вы поддерживаете битовый код, загрузчики вашего приложения получат только скомпилированную архитектуру, необходимую для их собственного устройства.
источник