Bitcode — ay ang intermediate na representasyon ng programa sa yugto ng compilation ng iOS application. Hindi tulad ng machine code, ang Bitcode ay hindi nakatali sa isang partikular na arkitektura ng processor. Ayon sa Apple Developer Documentation, ang App Store ay maaaring mag-recompile ng Bitcode para sa target na arkitektura, na nagpapabuti sa pagganap at nagpapaliit sa laki ng file ng pag-install. Ipinapadala ng developer ang Bitcode sa App Store, at ang tindahan mismo ang bumubuo ng na-optimize na binary file para sa bawat uri ng device.
Mga pangunahing punto
Bitcode ay kumakatawan sa isang intermediate na representasyon ng programa (Intermediate Representation, IR) na nabuo ng LLVM compiler infrastructure. Ipinakilala ng Apple ang suporta para sa Bitcode simula sa Xcode 7 at iOS 9 bilang isang mandatoryong kinakailangan para sa watchOS application at opsyonal para sa iOS at tvOS. Mula sa Xcode 14, ang mandatoryidad ay inalis para sa lahat ng platform maliban sa watchOS.
Ang konsepto ng intermediate na representasyon ng code ay umiiral mula noong 2000s sa loob ng balangkas ng LLVM project, na itinatag ni Chris Lattner sa University of Illinois. Inangkop ng Apple ang LLVM para sa Xcode noong 2011, at noong 2015 ay ipinakilala ang Bitcode bilang isang paraan upang i-update ang mga application nang hindi muling ipinapadala ang mga ito sa App Store. Ang teknolohiya ay inihayag sa WWDC 2015 sa session na “What’s New in Xcode”.
Machine code — ay mga binary na tagubilin para sa isang partikular na processor: arm64, armv7 o x86_64. Ang Bitcode ay naka-imbak sa isang hardware-independent na format, na nagpapahintulot sa App Store na bumuo ng mga na-optimize na binary file para sa iba't ibang arkitektura mula sa isang source na representasyon. Ito ang pangunahing pagkakaiba na tumutukoy sa lahat ng mga bentahe ng teknolohiya.
| Katangian | Bitcode | Machine code |
|---|---|---|
| Pagdepende sa arkitektura | Independent | Nakatali sa CPU |
| Laki ng binary file | Kompakto | Mas malaki |
| Posibilidad ng recompilation | Oo | Hindi |
| Suporta ng App Store | Nire-recompile | Ginagamit kung ano ito |
| Pag-debug | Limitado | Buong suporta |
Ang Bitcode ay hindi isang executable na file. Ito ay LLVM IR sa binary format na ipinapadala ng developer sa App Store kasama ng metadata ng proyekto. Ang tindahan ng application ay naglulunsad ng proseso ng recompilation, na iniangkop ang code para sa bawat target na platform at bersyon ng operating system.
Ang proseso ng pagbuo ng Bitcode ay nagsisimula sa frontend ng compiler, na nagko-convert ng Swift o Objective-C source code sa LLVM IR. Sa yugto ng linking, pinapackage ng Xcode ang IR sa mga file na format .bc (Bitcode), na pagkatapos ay ipinapadala sa App Store kasama ng .xcarchive archive. Ang App Store, sa turn, ay naglulunsad ng proseso ng recompilation sa panig nito.
Ang LLVM infrastructure ay binubuo ng tatlong bahagi: frontend (Clang para sa C/ObjC, Swift Frontend para sa Swift), Middle-End optimizer at backend (machine code generator). Ang Bitcode — ay resulta ng unang dalawang yugto nang hindi lumilipat sa pagbuo ng mga assembly instruction. Ang Middle-End ay nagsasagawa ng platform-independent na mga pag-optimize: pagtanggal ng patay na code, inlining at constant folding.
// Halimbawa ng Swift source code
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR pagkatapos ng compilation (pinasimple)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
Pagkatapos mabuo ang IR, ang compiler ay nagsasagawa ng serye ng mga pag-optimize sa antas ng representasyon: pagtanggal ng patay na code, inlining ng mga function at constant folding. Ang mga pag-optimize na ito ay hindi nakadepende sa arkitektura at nananatili sa Bitcode. Sa recompilation sa App Store, idinaragdag ang mga arkitektura-dependent na pag-optimize, tulad ng muling pagsasaayos ng mga tagubilin para sa partikular na processor.
App Store Connect ay tumatanggap ng archive na may Bitcode at naglulunsad ng sarili nitong compilation infrastructure. Tinutukoy ng system ang target na arkitektura ng device ng user at bumubuo ng machine code, na karagdagang ino-optimize ito para sa mga partikular na katangian ng processor. Para sa arm64e (A12+ at M-series processors) ay inilalapat ang mga karagdagang pag-optimize sa seguridad.
Ang prosesong ito ay tinatawag na App Thinning — isang teknolohiya na nagpapahintulot sa paghahatid sa device ng mga mapagkukunan at code na kinakailangan lamang para sa arkitektura nito. Ang gumagamit ng iPhone na may A17 Pro processor ay tumatanggap ng binary file na na-optimize para sa arm64e, nang walang mga hindi kinakailangang tagubilin para sa mga lumang arkitektura. Ito ay nagpapaikli sa oras ng pag-load at nakakatipid ng espasyo sa device.
Bitcode ay nagbibigay ng ilang pangunahing bentahe para sa mga developer ng iOS application. Ang pangunahing isa — awtomatikong pag-optimize para sa mga bagong Apple processor nang hindi muling naglalathala ng update sa App Store. Ito ay partikular na mahalaga kapag lumilipat sa mga bagong arkitektura, tulad ng paglipat mula armv7 patungong arm64.
Kapag naglabas ang Apple ng processor na may bagong arkitektura, ang mga application na ipinadala na may Bitcode ay awtomatikong nire-recompile para dito. Ang developer ay hindi kailangang muling itayo ang proyekto at maglathala ng update — ginagawa ito ng App Store sa panig nito sa unang pag-download ng user. Ito ay partikular na mahalaga para sa mga application na may mahabang buhay na sinusuportahan sa loob ng maraming taon.
App Thinning kasama ng Bitcode ay nagpapahintulot na bawasan ang laki ng naka-install na application ng 15–40%. Ang App Store ay bumubuo lamang ng mga machine instruction na kailangan para sa partikular na device, hindi kasama ang code para sa iba pang arkitektura at mga variation para sa iba't ibang bersyon ng iOS. Sa praktika, nangangahulugan ito na ang gumagamit na may bagong iPhone ay tumatanggap ng isang kompaktong binary file.
Ayon sa datos ng Apple WWDC 2015 Session 102, ang paggamit ng Bitcode at App Thinning ay maaaring mabawasan ang laki ng na-download na application ng average na 25% kumpara sa isang universal binary file na naglalaman ng lahat ng arkitektura. Para sa isang 100 MB application, ang natitipid ay maaaring umabot ng hanggang 40 MB sa device ng user.
Konfigurasyon ng Bitcode ay ginagawa sa build configuration ng Xcode. Ang parameter na Enable Bitcode ay matatagpuan sa Build Settings at naka-activate bilang default para sa mga bagong proyekto, ngunit maaaring i-deactivate ito ng mga developer para sa pag-debug o kapag gumagamit ng mga third-party na library na walang suporta sa Bitcode.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// O sa pamamagitan ng Info.plist para sa mga indibidwal na target
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Pagsusuri ng status ng Bitcode sa configuration
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Upang suriin kung ang archive ay naglalaman ng Bitcode, buksan ang .xcarchive file sa pamamagitan ng Xcode Organizer o isagawa ang command na otool -l sa Terminal. Ang pagkakaroon ng __LLVM section sa binary file ay nagpapatunay na ang Bitcode ay naka-activate at na-package nang tama. Kung wala ang section — ang Bitcode ay hindi nabuo sa build.
# Pagsusuri ng pagkakaroon ng Bitcode sa archive
otool -l YourApp.app/YourApp | grep __LLVM
# Resulta: kung may __LLVM section — ang Bitcode ay naroroon
# Kung ang resulta ay walang laman — ang Bitcode ay hindi naka-activate o hindi nabuo
# Maaari ring suriin sa pamamagitan ng size command
size -m -l YourApp.app/YourApp | grep __LLVM
Kapag gumagamit ng mga third-party na library sa pamamagitan ng CocoaPods o SPM, tiyakin na ang lahat ng dependencies ay binuo gamit ang Bitcode. Kung kahit isang library ay hindi sumusuporta sa Bitcode, ang Xcode ay bubuo ng linking error sa yugto ng pag-archive. Para sa CocoaPods, suriin ang bitcode_enabled flag sa podspecs o gumamit ng use_frameworks! na may enable_bitcode.
Bitcode ay hindi isang universal na solusyon para sa lahat ng uri ng iOS projects. Ang teknolohiya ay may mga limitasyon na dapat isaalang-alang ng developer bago i-activate ang opsyon sa build configuration. Ang pag-unawa sa mga limitasyong ito ay tumutulong na maiwasan ang mga problema sa yugto ng pag-archive at paglalathala.
Hindi lahat ng third-party na library ay ibinibigay na may suporta sa Bitcode. Kung ang isang library ay ipinamamahagi lamang bilang isang na-compile na binary file na walang Bitcode, ang proyekto na may naka-activate na opsyon ay hindi mabubuo. Sa kasong ito, ang developer ay kailangang i-deactivate ang Bitcode o humiling ng bersyon na may Bitcode mula sa supplier. Ito ay partikular na mahalaga para sa mga lumang library na hindi na na-update.
Mga ulat ng crash mula sa mga application na binuo gamit ang Bitcode ay nangangailangan ng karagdagang pagproseso. Ang mga simbolo (dSYM) para sa nire-compile na code ay nabuo ng App Store at available para i-download sa pamamagitan ng Xcode Organizer. Kung walang pag-download ng mga kaukulang dSYM file, ang call stack sa mga ulat ng crash ay hindi mababasa, na nagpapahirap sa pag-diagnose ng mga problema.
Simula sa iOS 17 at Xcode 15, hindi hinihiling ng Apple ang mandatoryong pag-activate ng Bitcode para sa paglalathala sa App Store. Gayunpaman, para sa watchOS application, ang Bitcode ay nananatiling isang mandatoryong kondisyon na itinakda sa antas ng mga patakaran ng App Store Connect. Ang mga developer ay inirerekomenda na i-activate ang Bitcode para sa mga bagong proyekto, kung sinusuportahan ito ng lahat ng dependencies.
Mga madalas itanong
Para sa iOS at tvOS application Bitcode ay hindi mandatory simula sa Xcode 14. Para sa watchOS ang suporta sa Bitcode ay nananatiling mandatory. Inirerekomenda ng Apple na i-activate ang Bitcode para sa mga bagong proyekto, ngunit hindi nito hinaharangan ang paglalathala nang wala ito.
Bitcode ay nagpapahintulot sa App Store na mag-apply ng App Thinning — pagbuo ng machine code lamang para sa arkitektura ng device ng user. Ito ay nagbabawas ng laki ng na-download na binary file ng 15–40% depende sa bilang ng mga sinusuportahang arkitektura sa proyekto.
Oo, ang mga dSYM file ay kinakailangan para sa simbolisasyon ng mga ulat ng crash mula sa nire-compile na binary file. Ang App Store ay nagbibigay ng posibilidad na i-download ang dSYM sa pamamagitan ng Xcode Organizer pagkatapos iproseso ang archive. Kung wala ang mga ito, ang call stack sa Crashlytics at console ay maglalaman lamang ng mga memory address.
SPM ay sumusuporta sa Bitcode kung ang mga dependency ay ipinamamahagi sa source code, hindi bilang binary file. Ang mga binary dependency sa pamamagitan ng SPM ay dapat magbigay ng bersyon na may Bitcode, kung hindi ang proyekto na may naka-activate na opsyon ay hindi magko-compile.
Bitcode — ay isang hardware-independent na intermediate na LLVM IR representasyon na hindi direktang ma-execute ng processor. Machine code ay naglalaman ng mga handa nang tagubilin para sa partikular na arkitektura (arm64, x86_64) at na-e-execute nang walang karagdagang compilation.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din