Bitcode — это промежуточное представление программы на этапе компиляции iOS-приложения. В отличие от машинного кода, Bitcode не привязан к конкретной архитектуре процессора. По данным Apple Developer Documentation, App Store способен перекомпилировать Bitcode под целевую архитектуру, что повышает производительность и уменьшает размер установочного файла. Разработчик отправляет Bitcode в App Store, а магазин сам генерирует оптимизированный бинарный файл для каждого типа устройства.
Главное
Bitcode представляет собой промежуточное представление программы (Intermediate Representation, IR), которое генерирует инфраструктура компилятора LLVM. Apple внедрила поддержку Bitcode начиная с Xcode 7 и iOS 9 как обязательное требование для watchOS-приложений и опциональное для iOS и tvOS. С Xcode 14 обязательность была отменена для всех платформ, кроме watchOS.
Концепция промежуточного представления кода существует с 2000-х годов в рамках проекта LLVM, основанного Крисом Латтнером в Университете Иллинойса. Apple адаптировала LLVM для Xcode в 2011 году, а в 2015 представила Bitcode как способ обновления приложений без повторной отправки в App Store. Технология была анонсирована на WWDC 2015 в сессии «What's New in Xcode».
Машинный код — это двоичные инструкции для конкретного процессора: arm64, armv7 или x86_64. Bitcode хранится в аппаратно-независимом формате, что позволяет App Store Converts генерировать оптимизированные бинарные файлы для разных архитектур из одного исходного представления. Это ключевое отличие, определяющее все преимущества технологии.
| Характеристика | Bitcode | Машинный код |
|---|---|---|
| Зависимость от архитектуры | Независим | Привязан к CPU |
| Размер бинарного файла | Компактный | Больше |
| Возможность рекомпиляции | Есть | Нет |
| Поддержка App Store | Рекомпилируется | Используется как есть |
| Отладка | Ограничена | Полная поддержка |
Bitcode не является исполняемым файлом. Это LLVM IR в двоичном формате, который разработчик отправляет в App Store вместе с метаданными проекта. Магазин приложений запускает процесс рекомпиляции, адаптируя код под каждую целевую платформу и версию операционной системы.
Процесс генерации Bitcode начинается с фронтенда компилятора, который преобразует исходный код Swift или Objective-C в LLVM IR. На этапе линковки Xcode упаковывает IR в файлы формата .bc (Bitcode), которые затем отправляются в App Store вместе с архивом .xcarchive. App Store, в свою очередь, запускает процесс рекомпиляции на своей стороне.
Инфраструктура LLVM состоит из трёх частей: фронтенд (Clang для C/ObjC, Swift Frontend для Swift), оптимизатор Middle-End и бэкенд (генератор машинного кода). Bitcode — это результат работы первых двух этапов без перехода к генерации ассемблерных инструкций. Middle-End выполняет платформонезависимые оптимизации: удаление мёртвого кода, инлайнинг и свёртку констант.
// Пример исходного кода Swift
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR после компиляции (упрощённо)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
После генерации IR компилятор выполняет серию оптимизаций на уровне представления: удаление мёртвого кода, инлайнинг функций и свёртку констант. Эти оптимизации не зависят от архитектуры и сохраняются в Bitcode. При рекомпиляции в App Store добавляются архитектурно-зависимые оптимизации, такие как перестановка инструкций для конкретного процессора.
App Store Connect принимает архив с Bitcode и запускает собственную инфраструктуру компиляции. Система определяет целевую архитектуру устройства пользователя и генерирует машинный код, дополнительно оптимизируя его под конкретные характеристики процессора. Для arm64e (процессоры A12+ и M-серии) применяются дополнительные оптимизации безопасности.
Этот процесс называется App Thinning — технология, позволяющая доставлять на устройство только те ресурсы и код, которые необходимы для его архитектуры. Пользователь iPhone с процессором A17 Pro получает бинарный файл, оптимизированный под arm64e, без лишних инструкций для устаревших архитектур. Это сокращает время загрузки и экономит место на устройстве.
Bitcode предоставляет несколько ключевых преимуществ для разработчиков iOS-приложений. Основное из них — автоматическая оптимизация под новые процессоры Apple без повторной выкладки обновления в App Store. Это особенно актуально при переходе на новые архитектуры, такие как переход с armv7 на arm64.
Когда Apple выпускает процессор с новой архитектурой, приложения, отправленные с Bitcode, автоматически перекомпилируются под неё. Разработчику не нужно собирать проект заново и публиковать обновление — App Store делает это на своей стороне при первом скачивании пользователем. Это особенно важно для долгоживущих приложений, которые поддерживаются годами.
App Thinning в сочетании с Bitcode позволяет сократить размер устанавливаемого приложения на 15–40%. App Store генерирует только те машинные инструкции, которые нужны конкретному устройству, исключая код для других архитектур и вариации для различных версий iOS. На практике это означает, что пользователь с новым iPhone получает компактный бинарный файл.
По данным Apple WWDC 2015 Session 102, использование Bitcode и App Thinning может уменьшить размер загружаемого приложения в среднем на 25% по сравнению с универсальным бинарным файлом, содержащим все архитектуры. Для приложения размером 100 МБ экономия может составить до 40 МБ на устройстве пользователя.
Настройка Bitcode выполняется в конфигурации сборки Xcode. Параметр Enable Bitcode находится в настройках Build Settings и по умолчанию включён для новых проектов, но разработчики могут отключить его для отладки или при использовании сторонних библиотек без поддержки Bitcode.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Или через Info.plist для отдельных таргетов
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Проверка статуса Bitcode в конфигурации
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Для проверки, содержит ли архив Bitcode, откройте файл .xcarchive через Xcode Organizer или выполните команду otool -l в Терминале. Наличие секции __LLVM в бинарном файле подтверждает, что Bitcode включён и упакован корректно. Если секция отсутствует — Bitcode не был сгенерирован при сборке.
# Проверка наличия Bitcode в архиве
otool -l YourApp.app/YourApp | grep __LLVM
# Вывод: если есть секция __LLVM — Bitcode присутствует
# Если вывод пустой — Bitcode не включён или не сгенерирован
# Также можно проверить через size команду
size -m -l YourApp.app/YourApp | grep __LLVM
При использовании сторонних библиотек через CocoaPods или SPM убедитесь, что все зависимости собраны с Bitcode. Если хотя бы одна библиотека не поддерживает Bitcode, Xcode сгенерирует ошибку линковки на этапе архивации. Для CocoaPods проверьте флаг bitcode_enabled в подспеках или используйте use_frameworks! с enable_bitcode.
Bitcode не является универсальным решением для всех типов iOS-проектов. У технологии есть ограничения, которые разработчику важно учитывать до включения опции в конфигурации сборки. Понимание этих ограничений помогает избежать проблем на этапе архивации и публикации.
Не все сторонние библиотеки поставляются с поддержкой Bitcode. Если библиотека распространяется только в виде скомпилированного бинарного файла без Bitcode, проект с включённой опцией не соберётся. В этом случае разработчику придётся либо отключить Bitcode, либо запросить у поставщика версию с Bitcode. Это особенно актуально для старых библиотек, которые больше не обновляются.
Краш-репорты из приложений, собранных с Bitcode, требуют дополнительной обработки. Символы (dSYM) для рекомпилированного кода генерируются App Store и доступны для загрузки через Xcode Organizer. Без загрузки соответствующих dSYM-файлов стек вызовов в отчётах о сбоях будет нечитаемым, что затрудняет диагностику проблем.
По состоянию на iOS 17 и Xcode 15 Apple не требует обязательного включения Bitcode для публикации в App Store. Однако для watchOS-приложений Bitcode остаётся обязательным условием, установленным на уровне правил App Store Connect. Разработчикам рекомендуется включать Bitcode для новых проектов, если все зависимости его поддерживают.
Часто задаваемые вопросы
Для iOS и tvOS-приложений Bitcode не является обязательным начиная с Xcode 14. Для watchOS поддержка Bitcode остаётся обязательной. Apple рекомендует включать Bitcode для новых проектов, но не блокирует публикацию без него.
Bitcode позволяет App Store применять App Thinning — генерацию машинного кода только под архитектуру устройства пользователя. Это сокращает размер загружаемого бинарного файла на 15–40% в зависимости от количества поддерживаемых архитектур в проекте.
Да, dSYM-файлы необходимы для символизации краш-репортов из рекомпилированных бинарных файлов. App Store предоставляет возможность загрузить dSYM через Xcode Organizer после обработки архива. Без них стек вызовов в Crashlytics и console будет содержать только адреса памяти.
SPM поддерживает Bitcode, если зависимости распространяются в исходном коде, а не в виде бинарных файлов. Бинарные зависимости через SPM должны предоставлять версию с Bitcode, иначе проект с включённой опцией не скомпилируется.
Bitcode — это аппаратно-независимое промежуточное представление LLVM IR, которое не может выполняться напрямую процессором. Машинный код содержит готовые инструкции для конкретной архитектуры (arm64, x86_64) и исполняется без дополнительной компиляции.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также