Bitcode — är en mellanliggande representation av programmet i kompileringsstadiet av en iOS-app. Till skillnad från maskinkod är Bitcode inte knutet till en specifik processorarkitektur. Enligt Apple Developer Documentation kan App Store omkompilera Bitcode för målarkitekturen, vilket förbättrar prestandan och minskar installationsfilens storlek. Utvecklaren skickar Bitcode till App Store och butiken själv genererar en optimerad binär fil för varje enhetstyp.
Huvudpunkter
Bitcode är en mellanliggande representation av programmet (Intermediate Representation, IR) som genereras av LLVM-kompilatorinfrastrukturen. Apple introducerade stöd för Bitcode från och med Xcode 7 och iOS 9 som ett obligatoriskt krav för watchOS-appar och valfritt för iOS och tvOS. Från och med Xcode 14 har obligatoriet tagits bort för alla plattformar utom watchOS.
Konceptet med mellanliggande kodrepresentation har funnits sedan 2000-talet inom ramen för LLVM-projektet, grundat av Chris Lattner vid University of Illinois. Apple anpassade LLVM för Xcode 2011 och introducerade 2015 Bitcode som ett sätt att uppdatera appar utan att skicka om dem till App Store. Tekniken tillkännagavs på WWDC 2015 i sessionen “What’s New in Xcode”.
Maskinkod — är binära instruktioner för en specifik processor: arm64, armv7 eller x86_64. Bitcode lagras i ett hårdvaruoberoende format, vilket gör att App Store kan generera optimerade binära filer för olika arkitekturer från en enda källrepresentation. Detta är den viktigaste skillnaden som bestämmer alla teknikens fördelar.
| Egenskap | Bitcode | Maskinkod |
|---|---|---|
| Beroende av arkitektur | Oberoende | Bunden till CPU |
| Binärfilens storlek | Kompakt | Större |
| Möjlighet till omkompilering | Ja | Nej |
| App Store-stöd | Omkompileras | Används som den är |
| Felsökning | Begränsad | Fullt stöd |
Bitcode är inte en körbar fil. Det är LLVM IR i binärt format som utvecklaren skickar till App Store tillsammans med projektmetadata. Appbutiken startar omkompileringsprocessen och anpassar koden för varje målplattform och operativsystemversion.
Processen för att generera Bitcode börjar med kompilatorns frontend, som omvandlar Swift- eller Objective-C-källkod till LLVM IR. I länkningsstadiet paketerar Xcode IR i filer av formatet .bc (Bitcode), som sedan skickas till App Store tillsammans med .xcarchive-arkivet. App Store startar i sin tur omkompileringsprocessen på sin sida.
LLVM-infrastrukturen består av tre delar: frontend (Clang för C/ObjC, Swift Frontend för Swift), Middle-End-optimeraren och backend (maskinkodsgenerator). Bitcode — är resultatet av de två första stegen utan att gå över till generering av assemblerinstruktioner. Middle-End utför plattformsoberoende optimeringar: borttagning av död kod, inlining och konstantvikning.
// Exempel på Swift-källkod
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR efter kompilering (förenklad)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
Efter att IR har genererats utför kompilatorn en serie optimeringar på representationsnivå: borttagning av död kod, inlining av funktioner och konstantvikning. Dessa optimeringar är inte arkitekturbaserade och bevaras i Bitcode. Vid omkompilering i App Store läggs arkitekturbaserade optimeringar till, såsom omordning av instruktioner för den specifika processorn.
App Store Connect tar emot arkivet med Bitcode och startar sin egen kompileringsinfrastruktur. Systemet bestämmer målarkitekturen för användarens enhet och genererar maskinkod, som ytterligare optimeras för processorns specifika egenskaper. För arm64e (A12+- och M-seriens processorer) tillämpas ytterligare säkerhetsoptimeringar.
Denna process kallas App Thinning — en teknik som gör att endast de resurser och den kod som behövs för enhetens arkitektur levereras. En iPhone-användare med A17 Pro-processor får en binär fil optimerad för arm64e, utan onödiga instruktioner för föråldrade arkitekturer. Detta förkortar laddningstiden och sparar utrymme på enheten.
Bitcode ger flera viktiga fördelar för iOS-apputvecklare. Den främsta är automatisk optimering för nya Apple-processorer utan att publicera om uppdateringen i App Store. Detta är särskilt relevant vid övergång till nya arkitekturer, såsom övergången från armv7 till arm64.
När Apple släpper en processor med en ny arkitektur, omkompileras appar som skickats med Bitcode automatiskt för den. Utvecklaren behöver inte bygga om projektet och publicera en uppdatering — App Store gör detta på sin sida vid användarens första nedladdning. Detta är särskilt viktigt för långlivade appar som stöds i flera år.
App Thinning i kombination med Bitcode kan minska storleken på den installerade appen med 15–40%. App Store genererar endast de maskininstruktioner som behövs för den specifika enheten, och utesluter kod för andra arkitekturer och varianter för olika iOS-versioner. I praktiken innebär detta att en användare med en ny iPhone får en kompakt binär fil.
Enligt data från Apple WWDC 2015 Session 102 kan användning av Bitcode och App Thinning minska storleken på den nedladdade appen med i genomsnitt 25% jämfört med en universell binär fil som innehåller alla arkitekturer. För en app på 100 MB kan besparingen uppgå till 40 MB på användarens enhet.
Konfiguration av Bitcode görs i Xcodes byggkonfiguration. Parametern Enable Bitcode finns i Build Settings och är som standard aktiverad för nya projekt, men utvecklare kan inaktivera den för felsökning eller när de använder tredjepartsbibliotek utan Bitcode-stöd.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Eller via Info.plist för enskilda targets
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Kontroll av Bitcode-status i konfigurationen
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
För att kontrollera om arkivet innehåller Bitcode, öppna .xcarchive-filen via Xcode Organizer eller kör kommandot otool -l i Terminal. Närvaron av sektionen __LLVM i den binära filen bekräftar att Bitcode är aktiverat och korrekt paketerat. Om sektionen saknas — Bitcode genererades inte vid bygget.
# Kontroll av Bitcode-förekomst i arkivet
otool -l YourApp.app/YourApp | grep __LLVM
# Resultat: om det finns en __LLVM-sektion — Bitcode finns
# Om resultatet är tomt — Bitcode är inte aktiverat eller inte genererat
# Kan även kontrolleras via kommandot size
size -m -l YourApp.app/YourApp | grep __LLVM
När du använder tredjepartsbibliotek via CocoaPods eller SPM, se till att alla beroenden är byggda med Bitcode. Om minst ett bibliotek inte stöder Bitcode kommer Xcode att generera ett länkningsfel vid arkiveringsstadiet. För CocoaPods, kontrollera flaggan bitcode_enabled i podspec-filer eller använd use_frameworks! med enable_bitcode.
Bitcode är inte en universell lösning för alla typer av iOS-projekt. Tekniken har begränsningar som utvecklaren måste överväga innan alternativet aktiveras i byggkonfigurationen. Att förstå dessa begränsningar hjälper till att undvika problem i arkiverings- och publiceringsstadiet.
Alla tredjepartsbibliotek levereras inte med Bitcode-stöd. Om ett bibliotek endast distribueras som en kompilerad binär fil utan Bitcode kommer projektet med det aktiverade alternativet inte att byggas. I så fall måste utvecklaren antingen inaktivera Bitcode eller begära en version med Bitcode från leverantören. Detta är särskilt relevant för gamla bibliotek som inte längre uppdateras.
Kraschrapporter från appar byggda med Bitcode kräver ytterligare bearbetning. Symboler (dSYM) för omkompilerad kod genereras av App Store och är tillgängliga för nedladdning via Xcode Organizer. Utan nedladdning av motsvarande dSYM-filer kommer anropsstacken i kraschrapporterna att vara oläslig, vilket försvårar diagnostisering av problem.
Från och med iOS 17 och Xcode 15 kräver Apple inte obligatorisk aktivering av Bitcode för publicering i App Store. För watchOS-appar förblir dock Bitcode ett obligatoriskt villkor som fastställts på nivån av App Store Connect-regler. Utvecklare rekommenderas att aktivera Bitcode för nya projekt om alla beroenden stöder det.
Vanliga frågor
För iOS- och tvOS-appar är Bitcode inte obligatoriskt från och med Xcode 14. För watchOS förblir Bitcode-stöd obligatoriskt. Apple rekommenderar att aktivera Bitcode för nya projekt, men blockerar inte publicering utan det.
Bitcode gör att App Store kan tillämpa App Thinning — generering av maskinkod endast för användarens enhetsarkitektur. Detta minskar storleken på den nedladdade binära filen med 15–40% beroende på antalet arkitekturer som stöds i projektet.
Ja, dSYM-filer är nödvändiga för symbolisering av kraschrapporter från omkompilerade binära filer. App Store erbjuder möjlighet att ladda ner dSYM via Xcode Organizer efter bearbetning av arkivet. Utan dem kommer anropsstacken i Crashlytics och konsol endast att innehålla minnesadresser.
SPM stöder Bitcode om beroenden distribueras i källkod, inte som binära filer. Binära beroenden via SPM måste tillhandahålla en version med Bitcode, annars kommer projektet med det aktiverade alternativet inte att kompileras.
Bitcode — är en hårdvaruoberoende mellanliggande LLVM IR-representation som inte kan exekveras direkt av processorn. Maskinkod innehåller färdiga instruktioner för en specifik arkitektur (arm64, x86_64) och exekveras utan ytterligare kompilering.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också