Bitcode — iOS tətbiqinin kompilyasiya mərhələsində proqramın aralıq təsviridir. Maşın kodundan fərqli olaraq, Bitcode prosessorun konkret arxitekturasına bağlı deyil. Apple Developer Documentation-ya görə, App Store Bitcode-u hədəf arxitekturaya uyğun yenidən kompilyasiya edə bilir, bu da performansı artırır və quraşdırma faylının ölçüsünü azaldır. Tərtibatçı Bitcode-u App Store-a göndərir, mağaza isə hər bir cihaz növü üçün optimallaşdırılmış ikili fayl yaradır.
Əsas məqamlar
Bitcode LLVM kompilyator infrastrukturunun yaratdığı proqramın aralıq təsviridir (Intermediate Representation, IR). Apple Xcode 7 və iOS 9-dan başlayaraq Bitcode dəstəyini watchOS tətbiqləri üçün məcburi, iOS və tvOS üçün isə isteğe bağlı olaraq tətbiq etdi. Xcode 14-dən etibarən watchOS xaric bütün platformalar üçün məcburilik ləğv edildi.
Aralıq kod təsviri konsepsiyası 2000-ci illərdən LLVM layihəsi çərçivəsində mövcuddur. Layihə İllinoys Universitetində Kris Lattner tərəfindən yaradılmışdır. Apple 2011-ci ildə LLVM-i Xcode üçün uyğunlaşdırdı, 2015-ci ildə isə Bitcode-u App Store-a təkrar göndərmədən tətbiqləri yeniləmə üsulu kimi təqdim etdi. Texnologiya WWDC 2015-də “What’s New in Xcode” sessiyasında elan edildi.
Maşın kodu — müəyyən prosessor üçün ikili təlimatlar dəstidir: arm64, armv7 və ya x86_64. Bitcode avadanlıqdan asılı olmayan formadda saxlanılır ki, bu da App Store-a bir mənbə təsvirindən müxtəlif arxitekturalar üçün optimallaşdırılmış ikili fayllar yaratmağa imkan verir. Bu, texnologiyanın bütün üstünlüklərini müəyyən edən əsas fərqdir.
| Xüsusiyyət | Bitcode | Maşın kodu |
|---|---|---|
| Arxitekturadan asılılıq | Asılı deyil | CPU-ya bağlıdır |
| İkili fayl ölçüsü | Yığcam | Daha böyük |
| Yenidən kompilyasiya imkanı | Var | Yoxdur |
| App Store dəstəyi | Yenidən kompilyasiya olunur | Olduğu kimi istifadə olunur |
| Debug | Məhdud | Tam dəstək |
Bitcode icra olunan fayl deyil. Bu, tərtibatçının layihə metadatanları ilə birlikdə App Store-a göndərdiyi ikili formatda LLVM IR-dir. Tətbiq mağazası hər bir hədəf platforma və əməliyyat sistemi versiyası üçün kodu uyğunlaşdıraraq rekompilyasiya prosesini işə salır.
Bitcode yaradılması prosesi Swift və ya Objective-C mənbə kodunu LLVM IR-ə çevirən kompilyatorun frontendindən başlayır. Linkləmə mərhələsində Xcode IR-i .bc (Bitcode) formatlı fayllara yığır, sonra isə .xcarchive arxivi ilə birlikdə App Store-a göndərilir. App Store öz növbəsində öz tərəfində rekompilyasiya prosesini işə salır.
LLVM infrastrukturu üç hissədən ibarətdir: frontend (C/ObjC üçün Clang, Swift üçün Swift Frontend), Middle-End optimallaşdırıcısı və backend (maşın kodu yaradıcısı). Bitcode — ilk iki mərhələnin nəticəsidir, assembler təlimatlarının yaradılmasına keçilmir. Middle-End platformadan asılı olmayan optimallaşdırmalar həyata keçirir: ölü kodun silinməsi, inlining və sabitlərin yığılması.
// Nümunə Swift mənbə kodu
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// Kompilyasiyadan sonra LLVM IR (sadələşdirilmiş)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
IR yaradıldıqdan sonra kompilyator təsvir səviyyəsində bir sıra optimallaşdırmalar həyata keçirir: ölü kodun silinməsi, funksiyaların inliningi və sabitlərin yığılması. Bu optimallaşdırmalar arxitekturadan asılı deyil və Bitcode-da saxlanılır. App Store-da rekompilyasiya zamanı konkret prosessor üçün təlimatların yenidən düzülməsi kimi arxitekturadan asılı optimallaşdırmalar əlavə edilir.
App Store Connect Bitcode ilə arxivi qəbul edir və öz kompilyasiya infrastrukturunu işə salır. Sistem istifadəçi cihazının hədəf arxitekturasını müəyyən edir və maşın kodu yaradır, onu prosessorun konkret xüsusiyyətlərinə uyğun optimallaşdırır. Arm64e (A12+ və M seriyası prosessorlar) üçün əlavə təhlükəsizlik optimallaşdırmaları tətbiq olunur.
Bu proses App Thinning adlanır — cihaza yalnız onun arxitekturası üçün lazım olan resursları və kodu çatdırmağa imkan verən texnologiya. A17 Pro prosessoru olan iPhone istifadəçisi arm64e üçün optimallaşdırılmış, köhnəlmiş arxitekturalar üçün lazımsız təlimatlar olmadan ikili fayl alır. Bu, yükləmə müddətini qısaldır və cihazda yerə qənaət edir.
Bitcode iOS tətbiqi tərtibatçıları üçün bir neçə əsas üstünlük təmin edir. Əsas odur ki, App Store-da yeniləməni yenidən yerləşdirmədən Apple-ın yeni prosessorları altında avtomatik optimallaşdırmadır. Bu, xüsusilə armv7-dən arm64-ə keçid kimi yeni arxitekturalara keçid zamanı aktualdır.
Apple yeni arxitekturaya malik prosessor buraxdıqda, Bitcode ilə göndərilmiş tətbiqlər avtomatik olaraq onun üçün yenidən kompilyasiya olunur. Tərtibatçı layihəni yenidən yığıb yeniləmə dərc etməli deyil — App Store bunu istifadəçi ilk dəfə yüklədikdə öz tərəfində edir. Bu, illərlə dəstəklənən uzunömürlü tətbiqlər üçün xüsusilə vacibdir.
App Thinning Bitcode ilə birlikdə quraşdırılan tətbiqin ölçüsünü 15–40% azaltmağa imkan verir. App Store yalnız müəyyən cihaza lazım olan maşın təlimatlarını yaradır, digər arxitekturalar üçün kodu və müxtəlif iOS versiyaları üçün variantları istisna edir. Praktikada bu o deməkdir ki, yeni iPhone istifadəçisi yığcam ikili fayl alır.
Apple WWDC 2015 Session 102 məlumatlarına görə, Bitcode və App Thinning istifadəsi bütün arxitekturaları ehtiva edən universal ikili faylla müqayisədə yüklənən tətbiqin ölçüsünü orta hesabla 25% azalda bilər. 100 MB ölçülü tətbiq üçün qənaət istifadəçi cihazında 40 MB-a qədər ola bilər.
Bitcode qurulması Xcode kompilyasiya konfiqurasiyasında həyata keçirilir. Enable Bitcode parametri Build Settings parametrlərində yerləşir və yeni layihələr üçün standart olaraq aktivdir, lakin tərtibatçılar debug zamanı və ya Bitcode dəstəyi olmayan üçüncü tərəf kitabxanalarından istifadə edərkən onu söndürə bilərlər.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Və ya ayrı-ayrı targetlər üçün Info.plist vasitəsilə
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Konfiqurasiyada Bitcode statusunun yoxlanması
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Arxivin Bitcode ehtiva edib-etmədiyini yoxlamaq üçün .xcarchive faylını Xcode Organizer vasitəsilə açın və ya Terminalda otool -l əmrini icra edin. İkili faylda __LLVM bölməsinin olması Bitcode-un aktiv olduğunu və düzgün paketləndiyini təsdiqləyir. Bölmə yoxdursa — Bitcode kompilyasiya zamanı yaradılmayıb.
# Arxivdə Bitcode-un olmasının yoxlanması
otool -l YourApp.app/YourApp | grep __LLVM
# Nəticə: __LLVM bölməsi varsa — Bitcode mövcuddur
# Nəticə boşdursa — Bitcode aktiv deyil və ya yaradılmayıb
# Həmçinin size əmri ilə yoxlamaq olar
size -m -l YourApp.app/YourApp | grep __LLVM
CocoaPods və ya SPM vasitəsilə üçüncü tərəf kitabxanalarından istifadə edərkən bütün asılılıqların Bitcode ilə yığıldığına əmin olun. Ən azı bir kitabxana Bitcode-u dəstəkləmirsə, Xcode arxivləşdirmə mərhələsində linkləmə xətası yaradacaq. CocoaPods üçün podspec-lərdə bitcode_enabled bayrağını yoxlayın və ya enable_bitcode ilə use_frameworks! istifadə edin.
Bitcode bütün iOS layihə növləri üçün universal həll deyil. Texnologiyanın məhdudiyyətləri var ki, tərtibatçı kompilyasiya konfiqurasiyasında seçimi aktivləşdirməzdən əvvəl nəzərə almalıdır. Bu məhdudiyyətləri başa düşmək arxivləşdirmə və dərc mərhələsində problemlərin qarşısını almağa kömək edir.
Bütün üçüncü tərəf kitabxanaları Bitcode dəstəyi ilə təmin edilmir. Əgər kitabxana yalnız Bitcode olmadan kompilyasiya olunmuş ikili fayl şəklində yayılırsa, aktiv seçimi olan layihə yığılmayacaq. Bu halda tərtibatçı ya Bitcode-u söndürməli, ya da təchizatçıdan Bitcode versiyasını tələb etməlidir. Bu, xüsusilə artıq yenilənməyən köhnə kitabxanalar üçün aktualdır.
Qəza hesabatları Bitcode ilə yığılmış tətbiqlərdən əlavə emal tələb edir. Yenidən kompilyasiya olunmuş kod üçün simvollar (dSYM) App Store tərəfindən yaradılır və Xcode Organizer vasitəsilə yükləmək üçün əlçatandır. Müvafiq dSYM faylları yüklənmədən qəza hesabatlarında çağırış yığını oxunmaz olacaq, bu da problemlərin diaqnostikasını çətinləşdirir.
iOS 17 və Xcode 15-ə əsasən Apple App Store-da dərc üçün Bitcode-un məcburi aktivləşdirilməsini tələb etmir. Lakin watchOS tətbiqləri üçün Bitcode App Store Connect qaydaları səviyyəsində müəyyən edilmiş məcburi şərt olaraq qalır. Tərtibatçılara bütün asılılıqlar onu dəstəkləyirsə, yeni layihələr üçün Bitcode-u aktivləşdirmək tövsiyə olunur.
Tez-tez verilən suallar
iOS və tvOS tətbiqləri üçün Bitcode Xcode 14-dən etibarən məcburi deyil. watchOS üçün Bitcode dəstəyi məcburi olaraq qalır. Apple yeni layihələr üçün Bitcode-u aktivləşdirməyi tövsiyə edir, lakin onsuz dərci bloklamır.
Bitcode App Store-a App Thinning tətbiq etməyə imkan verir — yalnız istifadəçi cihazının arxitekturası üçün maşın kodu yaradılması. Bu, yüklənən ikili faylın ölçüsünü layihədə dəstəklənən arxitekturaların sayından asılı olaraq 15–40% azaldır.
Bəli, dSYM faylları yenidən kompilyasiya olunmuş ikili fayllardan qəza hesabatlarını simvolizə etmək üçün vacibdir. App Store arxiv işləndikdən sonra Xcode Organizer vasitəsilə dSYM yükləmək imkanı verir. Onlar olmadan Crashlytics və konsolda çağırış yığını yalnız yaddaş ünvanlarını ehtiva edəcək.
SPM Bitcode-u dəstəkləyir, əgər asılılıqlar ikili fayllar şəklində deyil, mənbə kodunda yayılırsa. SPM vasitəsilə ikili asılılıqlar Bitcode ilə versiya təmin etməlidir, əks halda aktiv seçimi olan layihə kompilyasiya olunmayacaq.
Bitcode — prosessor tərəfindən birbaşa icra oluna bilməyən avadanlıqdan asılı olmayan aralıq LLVM IR təsviridir. Maşın kodu konkret arxitektura (arm64, x86_64) üçün hazır təlimatlar ehtiva edir və əlavə kompilyasiya olmadan icra olunur.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun