Bitcode — a program köztes reprezentációja az iOS-alkalmazás fordítási szakaszában. A gépi kóddal ellentétben a Bitcode nem kötődik egy adott processzorarchitektúrához. A Apple Developer Documentation szerint az App Store képes a Bitcode-ot a célarchitektúrára újrafordítani, ami növeli a teljesítményt és csökkenti a telepítőfájl méretét. A fejlesztő elküldi a Bitcode-ot az App Store-ba, és az áruház maga generál optimalizált bináris fájlt minden eszköztípushoz.
Főbb pontok
Bitcode a program köztes reprezentációja (Intermediate Representation, IR), amelyet az LLVM fordító infrastruktúrája generál. Az Apple az Xcode 7-től és iOS 9-től kezdve vezette be a Bitcode támogatását kötelező követelményként a watchOS alkalmazásokhoz, és opcionálisként iOS és tvOS esetén. Az Xcode 14-től kezdve a kötelezőséget minden platform esetén eltörölték, kivéve a watchOS-t.
A kód köztes reprezentációjának koncepciója a 2000-es évektől létezik a LLVM projekt keretében, amelyet Chris Lattner alapított az Illinois-i Egyetemen. Az Apple 2011-ben adaptálta az LLVM-et az Xcode-hoz, majd 2015-ben bemutatta a Bitcode-ot, mint az alkalmazások frissítésének módját anélkül, hogy újra el kellene küldeni az App Store-ba. A technológiát a WWDC 2015-ön jelentették be a „What’s New in Xcode” szekcióban.
Gépi kód — bináris utasítások egy adott processzorhoz: arm64, armv7 vagy x86_64. A Bitcode hardverfüggetlen formátumban tárolódik, ami lehetővé teszi az App Store számára, hogy optimalizált bináris fájlokat generáljon különböző architektúrákhoz egyetlen forrásreprezentációból. Ez a kulcsfontosságú különbség, amely meghatározza a technológia összes előnyét.
| Jellemző | Bitcode | Gépi kód |
|---|---|---|
| Architektúrától függőség | Független | CPU-hoz kötött |
| Bináris fájl mérete | Kompakt | Nagyobb |
| Újrafordítás lehetősége | Van | Nincs |
| App Store támogatás | Újrafordításra kerül | Ahogy van, úgy használatos |
| Hibakeresés | Korlátozott | Teljes támogatás |
A Bitcode nem végrehajtható fájl. Ez LLVM IR bináris formátumban, amelyet a fejlesztő a projekt metaadataival együtt küld el az App Store-ba. Az alkalmazásbolt elindítja az újrafordítási folyamatot, hozzáigazítva a kódot minden célplatformhoz és operációs rendszer verzióhoz.
A Bitcode generálásának folyamata a fordító frontendjével kezdődik, amely a Swift vagy Objective-C forráskódot LLVM IR-ré alakítja. A linkelési szakaszban az Xcode .bc (Bitcode) formátumú fájlokba csomagolja az IR-t, amelyeket aztán az .xcarchive archívummal együtt küldenek az App Store-ba. Az App Store pedig elindítja az újrafordítási folyamatot a saját oldalán.
Az LLVM infrastruktúra három részből áll: frontend (Clang C/ObjC-hez, Swift Frontend Swift-hez), Middle-End optimalizáló és backend (gépi kód generátor). A Bitcode — az első két szakasz eredménye, anélkül hogy áttérne assembly utasítások generálására. A Middle-End platformfüggetlen optimalizálásokat végez: holtkód eltávolítás, inlining és konstansösszevonás.
// Példa Swift forráskódra
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR fordítás után (egyszerűsítve)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
Az IR generálása után a fordító optimalizálási sorozatot hajt végre a reprezentáció szintjén: holtkód eltávolítás, függvények inlinelése és konstansösszevonás. Ezek az optimalizálások architektúrafüggetlenek, és megmaradnak a Bitcode-ban. Az App Store-ban történő újrafordításkor architektúrafüggő optimalizálások kerülnek hozzáadásra, például az utasítások átrendezése az adott processzorhoz.
App Store Connect fogadja a Bitcode-ot tartalmazó archívumot, és elindítja saját fordítási infrastruktúráját. A rendszer meghatározza a felhasználó eszközének célarchitektúráját, és gépi kódot generál, tovább optimalizálva azt a processzor specifikus jellemzőihez. Az arm64e (A12+ és M-sorozat processzorok) esetén további biztonsági optimalizálások kerülnek alkalmazásra.
Ezt a folyamatot App Thinning nak nevezik — egy technológia, amely lehetővé teszi, hogy csak az eszköz architektúrájához szükséges erőforrásokat és kódot szállítsák. Az A17 Pro processzorral rendelkező iPhone felhasználó arm64e-re optimalizált bináris fájlt kap, az elavult architektúrákhoz tartozó felesleges utasítások nélkül. Ez csökkenti a betöltési időt és helyet takarít meg az eszközön.
Bitcode számos kulcsfontosságú előnyt kínál az iOS-alkalmazásfejlesztők számára. A fő előny — automatikus optimalizálás az új Apple processzorokhoz anélkül, hogy újra közzé kellene tenni a frissítést az App Store-ban. Ez különösen fontos az új architektúrákra való áttéréskor, például az armv7-ről arm64-re való váltáskor.
Amikor az Apple új architektúrájú processzort bocsát ki, a Bitcode-dal elküldött alkalmazások automatikusan újrafordításra kerülnek rá. A fejlesztőnek nem kell újraépítenie a projektet és frissítést közzétennie — az App Store ezt a saját oldalán teszi meg a felhasználó első letöltésekor. Ez különösen fontos a hosszú életű alkalmazások esetében, amelyeket évekig támogatnak.
App Thinning a Bitcode-dal kombinálva lehetővé teszi a telepített alkalmazás méretének 15–40%-os csökkentését. Az App Store csak azokat a gépi utasításokat generálja, amelyek az adott eszközhöz szükségesek, kizárva a más architektúrákhoz tartozó kódot és a különböző iOS-verziók variációit. A gyakorlatban ez azt jelenti, hogy egy új iPhone felhasználó kompakt bináris fájlt kap.
Az Apple WWDC 2015 Session 102 adatai szerint a Bitcode és App Thinning használata átlagosan 25%-kal csökkentheti a letöltött alkalmazás méretét az összes architektúrát tartalmazó univerzális bináris fájlhoz képest. Egy 100 MB méretű alkalmazás esetén a megtakarítás akár 40 MB is lehet a felhasználó eszközén.
A Bitcode beállítása az Xcode fordítási konfigurációjában történik. Az Enable Bitcode paraméter a Build Settings beállításokban található, és alapértelmezetten be van kapcsolva új projekteknél, de a fejlesztők kikapcsolhatják hibakereséshez vagy ha olyan harmadik féltől származó könyvtárakat használnak, amelyek nem támogatják a Bitcode-ot.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Vagy Info.plist-en keresztül egyes targetekhez
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Bitcode állapotának ellenőrzése a konfigurációban
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Annak ellenőrzéséhez, hogy az archívum tartalmaz-e Bitcode-ot, nyissa meg az .xcarchive fájlt az Xcode Organizer segítségével, vagy futtassa a otool -l parancsot a Terminalban. A __LLVM szekció jelenléte a bináris fájlban megerősíti, hogy a Bitcode be van kapcsolva és helyesen van csomagolva. Ha a szekció hiányzik — a Bitcode nem lett legenerálva a fordítás során.
# Bitcode jelenlétének ellenőrzése az archívumban
otool -l YourApp.app/YourApp | grep __LLVM
# Eredmény: ha van __LLVM szekció — a Bitcode jelen van
# Ha az eredmény üres — a Bitcode nincs bekapcsolva vagy nem lett legenerálva
# Szintén ellenőrizhető a size paranccsal
size -m -l YourApp.app/YourApp | grep __LLVM
Harmadik féltől származó könyvtárak CocoaPods-on vagy SPM-en keresztüli használatakor győződjön meg arról, hogy az összes függőség Bitcode-dal lett lefordítva. Ha legalább egy könyvtár nem támogatja a Bitcode-ot, az Xcode linkelési hibát generál az archiválási szakaszban. A CocoaPods esetében ellenőrizze a bitcode_enabled jelzőt a podspec-ekben, vagy használja a use_frameworks!-ot enable_bitcode-val.
Bitcode nem univerzális megoldás minden típusú iOS projekthez. A technológiának vannak korlátozásai, amelyeket a fejlesztőnek figyelembe kell vennie, mielőtt bekapcsolja az opciót a fordítási konfigurációban. E korlátozások megértése segít elkerülni a problémákat az archiválási és közzétételi szakaszban.
Nem minden harmadik féltől származó könyvtár érkezik Bitcode támogatással. Ha egy könyvtár csak lefordított bináris fájlként kerül terjesztésre Bitcode nélkül, a bekapcsolt opcióval rendelkező projekt nem fog lefordulni. Ebben az esetben a fejlesztőnek vagy ki kell kapcsolnia a Bitcode-ot, vagy kérnie kell a szállítótól egy Bitcode-os verziót. Ez különösen fontos a régi könyvtárak esetében, amelyeket már nem frissítenek.
Összeomlási jelentések a Bitcode-dal lefordított alkalmazásokból további feldolgozást igényelnek. Az újrafordított kód szimbólumait (dSYM) az App Store generálja, és az Xcode Organizeren keresztül tölthetők le. A megfelelő dSYM fájlok letöltése nélkül a hívási verem az összeomlási jelentésekben olvashatatlan lesz, ami megnehezíti a problémák diagnosztizálását.
iOS 17 és Xcode 15 állapot szerint az Apple nem követeli meg a Bitcode kötelező bekapcsolását az App Store-ban történő közzétételhez. A watchOS alkalmazások esetében azonban a Bitcode továbbra is kötelező feltétel marad, amelyet az App Store Connect szabályai határoznak meg. A fejlesztőknek ajánlott bekapcsolni a Bitcode-ot új projektekhez, ha az összes függőség támogatja azt.
Gyakran ismételt kérdések
iOS és tvOS alkalmazások esetén a Bitcode nem kötelező az Xcode 14-től kezdve. A watchOS esetében a Bitcode támogatása továbbra is kötelező. Az Apple ajánlja a Bitcode bekapcsolását új projektekhez, de nem blokkolja a közzétételt anélkül.
A Bitcode lehetővé teszi az App Store számára az App Thinning alkalmazását — gépi kód generálását csak a felhasználó eszközének architektúrájához. Ez a letöltött bináris fájl méretét 15–40%-kal csökkenti a projektben támogatott architektúrák számától függően.
Igen, a dSYM fájlok szükségesek az újrafordított bináris fájlokból származó összeomlási jelentések szimbolizálásához. Az App Store lehetőséget biztosít a dSYM letöltésére az Xcode Organizer segítségével az archívum feldolgozása után. Nélkülük a hívási verem a Crashlytics-ben és konzolban csak memóriacímeket fog tartalmazni.
Az SPM támogatja a Bitcode-ot, ha a függőségek forráskódban kerülnek terjesztésre, nem bináris fájlokként. Az SPM-en keresztüli bináris függőségeknek Bitcode-os verziót kell biztosítaniuk, különben a bekapcsolt opcióval rendelkező projekt nem fog lefordulni.
A Bitcode — egy hardverfüggetlen köztes LLVM IR reprezentáció, amelyet a processzor nem tud közvetlenül végrehajtani. A Gépi kód kész utasításokat tartalmaz egy adott architektúrához (arm64, x86_64), és további fordítás nélkül végrehajtódik.
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is