Bitcode — je mezní reprezentace programu ve fázi kompilace iOS aplikace. Na rozdíl od strojového kódu není Bitcode vázán na konkrétní architekturu procesoru. Podle Apple Developer Documentation dokáže App Store překompilovat Bitcode pro cílovou architekturu, což zvyšuje výkon a zmenšuje velikost instalačního souboru. Vývojář odešle Bitcode do App Store a obchod sám generuje optimalizovaný binární soubor pro každý typ zařízení.
Hlavní body
Bitcode představuje mezní reprezentaci programu (Intermediate Representation, IR), kterou generuje infrastruktura překladače LLVM. Apple zavedla podporu Bitcode od Xcode 7 a iOS 9 jako povinný požadavek pro watchOS aplikace a volitelný pro iOS a tvOS. Od Xcode 14 byla povinnost zrušena pro všechny platformy kromě watchOS.
Koncepce mezní reprezentace kódu existuje od roku 2000 v rámci projektu LLVM, založeného Chrisem Lattnerem na University of Illinois. Apple přizpůsobila LLVM pro Xcode v roce 2011 a v roce 2015 představila Bitcode jako způsob aktualizace aplikací bez opětovného odesílání do App Store. Technologie byla oznámena na WWDC 2015 v sekci „What’s New in Xcode”.
Strojový kód — jsou binární instrukce pro konkrétní procesor: arm64, armv7 nebo x86_64. Bitcode je uložen v hardwarově nezávislém formátu, což umožňuje App Store generovat optimalizované binární soubory pro různé architektury z jedné zdrojové reprezentace. To je klíčový rozdíl, který určuje všechny výhody technologie.
| Vlastnost | Bitcode | Strojový kód |
|---|---|---|
| Závislost na architektuře | Nezávislý | Vázán na CPU |
| Velikost binárního souboru | Kompaktní | Větší |
| Možnost rekompilace | Ano | Ne |
| Podpora App Store | Rekompiluje se | Používá se tak, jak je |
| Ladění | Omezené | Plná podpora |
Bitcode není spustitelný soubor. Je to LLVM IR v binárním formátu, který vývojář odesílá do App Store spolu s metadaty projektu. Obchod s aplikacemi spouští proces rekompilace a přizpůsobuje kód každé cílové platformě a verzi operačního systému.
Proces generování Bitcode začíná frontendem překladače, který převádí zdrojový kód Swift nebo Objective-C do LLVM IR. Ve fázi linkování Xcode zabalí IR do souborů formátu .bc (Bitcode), které jsou poté odeslány do App Store spolu s archivem .xcarchive. App Store následně spouští proces rekompilace na své straně.
Infrastruktura LLVM se skládá ze tří částí: frontend (Clang pro C/ObjC, Swift Frontend pro Swift), optimalizátor Middle-End a backend (generátor strojového kódu). Bitcode — je výsledkem prvních dvou fází bez přechodu ke generování assemblerových instrukcí. Middle-End provádí platformově nezávislé optimalizace: odstraňování mrtvého kódu, inlining a skládání konstant.
// Příklad zdrojového kódu Swift
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR po kompilaci (zjednodušeně)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
Po vygenerování IR provádí překladač sérii optimalizací na úrovni reprezentace: odstraňování mrtvého kódu, inlining funkcí a skládání konstant. Tyto optimalizace nejsou závislé na architektuře a jsou uchovány v Bitcode. Při rekompilaci v App Store jsou přidány architektonicky závislé optimalizace, jako je přeskupení instrukcí pro konkrétní procesor.
App Store Connect přijímá archiv s Bitcode a spouští vlastní infrastrukturu kompilace. Systém určuje cílovou architekturu zařízení uživatele a generuje strojový kód, který dále optimalizuje pro konkrétní charakteristiky procesoru. Pro arm64e (procesory A12+ a řady M) jsou aplikovány dodatečné bezpečnostní optimalizace.
Tento proces se nazývá App Thinning — technologie umožňující doručit na zařízení pouze ty zdroje a kód, které jsou nezbytné pro jeho architekturu. Uživatel iPhone s procesorem A17 Pro získává binární soubor optimalizovaný pro arm64e, bez zbytečných instrukcí pro zastaralé architektury. To zkracuje dobu načítání a šetří místo na zařízení.
Bitcode poskytuje několik klíčových výhod pro vývojáře iOS aplikací. Hlavní z nich — automatická optimalizace pro nové procesory Apple bez opětovného publikování aktualizace v App Store. To je obzvláště důležité při přechodu na nové architektury, jako je přechod z armv7 na arm64.
Když Apple vydá procesor s novou architekturou, aplikace odeslané s Bitcode se pro něj automaticky překompilují. Vývojář nemusí znovu sestavovat projekt a publikovat aktualizaci — App Store to udělá na své straně při prvním stažení uživatelem. To je obzvláště důležité pro dlouhodobé aplikace, které jsou podporovány roky.
App Thinning v kombinaci s Bitcode umožňuje zmenšit velikost instalované aplikace o 15–40%. App Store generuje pouze ty strojové instrukce, které jsou potřeba pro konkrétní zařízení, a vynechává kód pro jiné architektury a varianty pro různé verze iOS. V praxi to znamená, že uživatel s novým iPhonem obdrží kompaktní binární soubor.
Podle údajů Apple WWDC 2015 Session 102 může použití Bitcode a App Thinning snížit velikost stahované aplikace v průměru o 25% ve srovnání s univerzálním binárním souborem obsahujícím všechny architektury. U aplikace o velikosti 100 MB může úspora na zařízení uživatele činit až 40 MB.
Nastavení Bitcode se provádí v konfiguraci sestavení Xcode. Parametr Enable Bitcode se nachází v nastavení Build Settings a je ve výchozím stavu zapnutý pro nové projekty, ale vývojáři jej mohou vypnout pro ladění nebo při používání knihoven třetích stran bez podpory Bitcode.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Nebo přes Info.plist pro jednotlivé targety
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Kontrola stavu Bitcode v konfiguraci
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Pro kontrolu, zda archiv obsahuje Bitcode, otevřete soubor .xcarchive přes Xcode Organizer nebo spusťte příkaz otool -l v Terminálu. Přítomnost sekce __LLVM v binárním souboru potvrzuje, že Bitcode je zapnutý a správně zabalený. Pokud sekce chybí — Bitcode nebyl při sestavení vygenerován.
# Kontrola přítomnosti Bitcode v archivu
otool -l YourApp.app/YourApp | grep __LLVM
# Výsledek: pokud existuje sekce __LLVM — Bitcode je přítomen
# Pokud je výsledek prázdný — Bitcode není zapnutý nebo nebyl vygenerován
# Lze také zkontrolovat pomocí příkazu size
size -m -l YourApp.app/YourApp | grep __LLVM
Při používání knihoven třetích stran přes CocoaPods nebo SPM se ujistěte, že všechny závislosti jsou sestaveny s Bitcode. Pokud alespoň jedna knihovna nepodporuje Bitcode, Xcode vygeneruje chybu linkování ve fázi archivace. Pro CocoaPods zkontrolujte přepínač bitcode_enabled v podspec nebo použijte use_frameworks! s enable_bitcode.
Bitcode není univerzálním řešením pro všechny typy iOS projektů. Tato technologie má omezení, která by měl vývojář zvážit před zapnutím volby v konfiguraci sestavení. Pochopení těchto omezení pomáhá vyhnout se problémům ve fázi archivace a publikace.
Ne všechny knihovny třetích stran jsou dodávány s podporou Bitcode. Pokud je knihovna distribuována pouze jako zkompilovaný binární soubor bez Bitcode, projekt se zapnutou volbou se nesestaví. V takovém případě bude muset vývojář buď vypnout Bitcode, nebo požádat dodavatele o verzi s Bitcode. To je obzvláště důležité pro staré knihovny, které již nejsou aktualizovány.
Hlášení pádů z aplikací sestavených s Bitcode vyžadují dodatečné zpracování. Symboly (dSYM) pro překompilovaný kód jsou generovány App Store a jsou k dispozici ke stažení přes Xcode Organizer. Bez stažení odpovídajících dSYM souborů bude zásobník volání v hlášeních pádů nečitelný, což ztěžuje diagnostiku problémů.
Od iOS 17 a Xcode 15 Apple nevyžaduje povinné zapnutí Bitcode pro publikaci v App Store. Pro watchOS aplikace však Bitcode zůstává povinnou podmínkou stanovenou na úrovni pravidel App Store Connect. Vývojářům se doporučuje zapnout Bitcode pro nové projekty, pokud všechny závislosti tuto technologii podporují.
Často kladené otázky
Pro iOS a tvOS aplikace Bitcode není povinný od Xcode 14. Pro watchOS zůstává podpora Bitcode povinná. Apple doporučuje zapnout Bitcode pro nové projekty, ale neblokuje publikaci bez něj.
Bitcode umožňuje App Store aplikovat App Thinning — generování strojového kódu pouze pro architekturu zařízení uživatele. To snižuje velikost stahovaného binárního souboru o 15–40% v závislosti na počtu podporovaných architektur v projektu.
Ano, dSYM soubory jsou nezbytné pro symbolizaci hlášení pádů z překompilovaných binárních souborů. App Store poskytuje možnost stáhnout dSYM přes Xcode Organizer po zpracování archivu. Bez nich bude zásobník volání v Crashlytics a konzole obsahovat pouze adresy paměti.
SPM podporuje Bitcode, pokud jsou závislosti distribuovány ve zdrojovém kódu, nikoli jako binární soubory. Binární závislosti přes SPM musí poskytovat verzi s Bitcode, jinak se projekt se zapnutou volbou nezkompiluje.
Bitcode — je hardwarově nezávislá mezní reprezentace LLVM IR, kterou nelze přímo spustit procesorem. Strojový kód obsahuje hotové instrukce pro konkrétní architekturu (arm64, x86_64) a spouští se bez dodatečné kompilace.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také