Bitcode — је посредна репрезентација програма у фази компилације iOS апликације. За разлику од машинског кода, Bitcode није везан за конкретну архитектуру процесора. Према Apple Developer Documentation, App Store може да прекомпајлира Bitcode за циљану архитектуру, што повећава перформансе и смањује величину инсталационе датотеке. Програмер шаље Bitcode у App Store, а продавница сама генерише оптимизовану бинарну датотеку за сваки тип уређаја.
Главно
Bitcode представља посредну репрезентацију програма (Intermediate Representation, IR) коју генерише инфраструктура компајлера LLVM. Епл је увела подршку за Bitcode почев од Xcode 7 и iOS 9 као обавезни захтев за watchOS апликације и опциони за iOS и tvOS. Од Xcode 14 обавезност је укинута за све платформе осим watchOS.
Концепт посредне репрезентације кода постоји од 2000-их у оквиру пројекта LLVM, који је основао Крис Латнер на Универзитету Илиноиса. Епл је прилагодила 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+ и М-серије) примењују се додатне безбедносне оптимизације.
Овај процес се назива App Thinning — технологија која омогућава испоруку на уређај само оних ресурса и кода који су потребни за његову архитектуру. Корисник iPhone-а са процесором A17 Pro добија бинарну датотеку оптимизовану за arm64e, без непотребних инструкција за застареле архитектуре. То скраћује време учитавања и штеди простор на уређају.
Bitcode пружа неколико кључних предности за програмере iOS апликација. Главна од њих — аутоматска оптимизација за нове Епл процесоре без поновног објављивања ажурирања у App Store-у. Ово је посебно значајно при преласку на нове архитектуре, као што је прелазак са armv7 на arm64.
Када Епл објави процесор са новом архитектуром, апликације послате са 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 у подспецима или користите use_frameworks! са enable_bitcode.
Bitcode није универзално решење за све типове iOS пројеката. Технологија има ограничења која програмер треба да узме у обзир пре укључивања опције у конфигурацији компилације. Разумевање ових ограничења помаже у избегавању проблема у фази архивирања и објављивања.
Нису све библиотеке трећих страна испоручене са подршком за Bitcode. Ако се библиотека дистрибуира само као компајлирана бинарна датотека без Bitcode-а, пројекат са укљученом опцијом неће бити састављен. У овом случају програмер ће морати или да искључи Bitcode, или да затражи од добављача верзију са Bitcode-ом. Ово је посебно значајно за старе библиотеке које се више не ажурирају.
Извештаји о падовима из апликација компајлираних са Bitcode-ом захтевају додатну обраду. Симболи (dSYM) за прекомпајлирани код се генеришу од стране App Store-а и доступни су за преузимање путем Xcode Organizer-а. Без преузимања одговарајућих dSYM датотека, стек позива у извештајима о падовима биће нечитљив, што отежава дијагностику проблема.
Од iOS 17 и Xcode 15, Епл не захтева обавезно укључивање Bitcode-а за објављивање у App Store-у. Међутим, за watchOS апликације Bitcode остаје обавезан услов постављен на нивоу правила App Store Connect-а. Програмерима се препоручује да укључе Bitcode за нове пројекте, ако све зависности га подржавају.
Често постављана питања
За iOS и tvOS апликације Bitcode није обавезан од Xcode 14. За watchOS подршка за Bitcode остаје обавезна. Епл препоручује укључивање 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође