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 да генерира оптимизирани двоични файлове за различни архитектури от едно изходно представяне. Това е ключовата разлика, която определя всички предимства на технологията.
| Характеристика | 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 MB, икономията може да достигне до 40 MB на устройството на потребителя.
Настройка на Bitcode се извършва в конфигурацията за компилиране на Xcode. Параметърът Enable Bitcode се намира в настройките Build Settings и по подразбиране е включен за нови проекти, но разработчиците могат да го изключат за отстраняване на грешки или при използване на библиотеки на трети страни без поддръжка на Bitcode.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Или чрез Info.plist за отделни target-ове
@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 в podspec-овете или използвайте 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 и конзолата ще съдържа само адреси на паметта.
SPM поддържа Bitcode, ако зависимостите се разпространяват в изходен код, а не като двоични файлове. Двоичните зависимости чрез SPM трябва да предоставят версия с Bitcode, в противен случай проектът с включена опция няма да се компилира.
Bitcode — е хардуерно независимо междинно представяне на LLVM IR, което не може да бъде изпълнено директно от процесора. Машинният код съдържа готови инструкции за конкретна архитектура (arm64, x86_64) и се изпълнява без допълнително компилиране.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също