Bitcode — είναι η ενδιάμεση αναπαράσταση του προγράμματος στο στάδιο μεταγλώττισης της εφαρμογής iOS. Σε αντίθεση με τον κώδικα μηχανής, το Bitcode δεν είναι συνδεδεμένο με μια συγκεκριμένη αρχιτεκτονική επεξεργαστή. Σύμφωνα με το Apple Developer Documentation, το App Store μπορεί να αναμεταγλωττίσει το Bitcode για την αρχιτεκτονική-στόχο, βελτιώνοντας την απόδοση και μειώνοντας το μέγεθος του αρχείου εγκατάστασης. Ο προγραμματιστής στέλνει το Bitcode στο App Store και το κατάστημα δημιουργεί το βελτιστοποιημένο δυαδικό αρχείο για κάθε τύπο συσκευής.
Κύρια σημεία
Bitcode αποτελεί μια ενδιάμεση αναπαράσταση του προγράμματος (Intermediate Representation, IR) που δημιουργεί η υποδομή μεταγλωττιστή LLVM. Η Apple εισήγαγε υποστήριξη για Bitcode από το Xcode 7 και iOS 9 ως υποχρεωτική απαίτηση για εφαρμογές watchOS και προαιρετική για iOS και tvOS. Από το Xcode 14, η υποχρεωτικότητα καταργήθηκε για όλες τις πλατφόρμες εκτός από το watchOS.
Η έννοια της ενδιάμεσης αναπαράστασης κώδικα υπάρχει από τη δεκαετία του 2000 στο πλαίσιο του έργου LLVM, που ιδρύθηκε από τον Chris Lattner στο Πανεπιστήμιο του Ιλινόι. Η Apple προσάρμοσε το LLVM για το Xcode το 2011 και το 2015 παρουσίασε το Bitcode ως τρόπο ενημέρωσης εφαρμογών χωρίς εκ νέου αποστολή στο App Store. Η τεχνολογία ανακοινώθηκε στο WWDC 2015 στη συνεδρία “What’s New in Xcode”.
Κώδικας μηχανής — είναι δυαδικές εντολές για συγκεκριμένο επεξεργαστή: arm64, armv7 ή x86_64. Το Bitcode αποθηκεύεται σε μορφή ανεξάρτητη από υλικό, επιτρέποντας στο App Store να δημιουργεί βελτιστοποιημένα δυαδικά αρχεία για διαφορετικές αρχιτεκτονικές από μία πηγαία αναπαράσταση. Αυτή είναι η βασική διαφορά που καθορίζει όλα τα πλεονεκτήματα της τεχνολογίας.
| Χαρακτηριστικό | Bitcode | Κώδικας μηχανής |
|---|---|---|
| Εξάρτηση από αρχιτεκτονική | Ανεξάρτητο | Συνδεδεμένο με CPU |
| Μέγεθος δυαδικού αρχείου | Συμπαγές | Μεγαλύτερο |
| Δυνατότητα αναμεταγλώττισης | Υπάρχει | Δεν υπάρχει |
| Υποστήριξη App Store | Αναμεταγλωττίζεται | Χρησιμοποιείται ως έχει |
| Αποσφαλμάτωση | Περιορισμένη | Πλήρης υποστήριξη |
Το Bitcode δεν είναι εκτελέσιμο αρχείο. Είναι LLVM IR σε δυαδική μορφή που ο προγραμματιστής στέλνει στο App Store μαζί με τα μεταδεδομένα του έργου. Το κατάστημα εφαρμογών ξεκινά τη διαδικασία αναμεταγλώττισης, προσαρμόζοντας τον κώδικα για κάθε πλατφόρμα-στόχο και έκδοση λειτουργικού συστήματος.
Η διαδικασία δημιουργίας Bitcode ξεκινά με το frontend του μεταγλωττιστή, το οποίο μετατρέπει τον πηγαίο κώδικα Swift ή Objective-C σε LLVM IR. Στο στάδιο σύνδεσης, το Xcode συσκευάζει το IR σε αρχεία μορφής .bc (Bitcode), τα οποία στη συνέχεια αποστέλλονται στο App Store μαζί με το αρχείο .xcarchive. Το App Store με τη σειρά του ξεκινά τη διαδικασία αναμεταγλώττισης από την πλευρά του.
Η υποδομή LLVM αποτελείται από τρία μέρη: frontend (Clang για C/ObjC, Swift Frontend για Swift), βελτιστοποιητή Middle-End και backend (δημιουργό κώδικα μηχανής). Το Bitcode — είναι το αποτέλεσμα των δύο πρώτων σταδίων χωρίς μετάβαση στη δημιουργία εντολών assembly. Το Middle-End εκτελεί βελτιστοποιήσεις ανεξάρτητες από πλατφόρμα: αφαίρεση νεκρού κώδικα, inlining και αναδίπλωση σταθερών.
// Παράδειγμα πηγαίου κώδικα Swift
func calculateSum(a: Int, b: Int) -> Int {
return a + b
}
// LLVM IR μετά τη μεταγλώττιση (απλοποιημένο)
; define i32 @calculateSum(i32 %a, i32 %b)
; %result = add i32 %a, %b
; ret i32 %result
Μετά τη δημιουργία του IR, ο μεταγλωττιστής εκτελεί μια σειρά βελτιστοποιήσεων σε επίπεδο αναπαράστασης: αφαίρεση νεκρού κώδικα, inlining συναρτήσεων και αναδίπλωση σταθερών. Αυτές οι βελτιστοποιήσεις δεν εξαρτώνται από την αρχιτεκτονική και διατηρούνται στο Bitcode. Κατά την αναμεταγλώττιση στο App Store, προστίθενται βελτιστοποιήσεις που εξαρτώνται από την αρχιτεκτονική, όπως η αναδιάταξη εντολών για τον συγκεκριμένο επεξεργαστή.
App Store Connect λαμβάνει το αρχείο με Bitcode και ξεκινά τη δική του υποδομή μεταγλώττισης. Το σύστημα καθορίζει την αρχιτεκτονική-στόχο της συσκευής του χρήστη και δημιουργεί κώδικα μηχανής, βελτιστοποιώντας τον περαιτέρω για τα συγκεκριμένα χαρακτηριστικά του επεξεργαστή. Για arm64e (επεξεργαστές A12+ και σειρά M) εφαρμόζονται πρόσθετες βελτιστοποιήσεις ασφαλείας.
Αυτή η διαδικασία ονομάζεται App Thinning — μια τεχνολογία που επιτρέπει την παράδοση στη συσκευή μόνο των πόρων και του κώδικα που είναι απαραίτητοι για την αρχιτεκτονική της. Ο χρήστης iPhone με επεξεργαστή A17 Pro λαμβάνει ένα δυαδικό αρχείο βελτιστοποιημένο για arm64e, χωρίς περιττές εντολές για παλαιότερες αρχιτεκτονικές. Αυτό μειώνει τον χρόνο φόρτωσης και εξοικονομεί χώρο στη συσκευή.
Bitcode παρέχει πολλά βασικά πλεονεκτήματα για προγραμματιστές εφαρμογών iOS. Το κυριότερο — αυτόματη βελτιστοποίηση για νέους επεξεργαστές Apple χωρίς εκ νέου δημοσίευση ενημέρωσης στο App Store. Αυτό είναι ιδιαίτερα σημαντικό κατά τη μετάβαση σε νέες αρχιτεκτονικές, όπως η μετάβαση από armv7 σε arm64.
Όταν η Apple κυκλοφορεί έναν επεξεργαστή με νέα αρχιτεκτονική, οι εφαρμογές που αποστέλλονται με Bitcode αναμεταγλωττίζονται αυτόματα γι’ αυτήν. Ο προγραμματιστής δεν χρειάζεται να ξαναχτίσει το έργο και να δημοσιεύσει ενημέρωση — το App Store το κάνει από την πλευρά του κατά την πρώτη λήψη από τον χρήστη. Αυτό είναι ιδιαίτερα σημαντικό για μακρόβιες εφαρμογές που υποστηρίζονται για χρόνια.
App Thinning σε συνδυασμό με Bitcode επιτρέπει τη μείωση του μεγέθους της εγκατεστημένης εφαρμογής κατά 15–40%. Το App Store δημιουργεί μόνο τις εντολές μηχανής που χρειάζονται για τη συγκεκριμένη συσκευή, αποκλείοντας κώδικα για άλλες αρχιτεκτονικές και παραλλαγές για διαφορετικές εκδόσεις iOS. Στην πράξη, αυτό σημαίνει ότι ο χρήστης με νέο iPhone λαμβάνει ένα συμπαγές δυαδικό αρχείο.
Σύμφωνα με δεδομένα του Apple WWDC 2015 Session 102, η χρήση Bitcode και App Thinning μπορεί να μειώσει το μέγεθος της ληφθείσας εφαρμογής κατά μέσο όρο 25% σε σύγκριση με ένα καθολικό δυαδικό αρχείο που περιέχει όλες τις αρχιτεκτονικές. Για μια εφαρμογή 100 MB, η εξοικονόμηση μπορεί να φτάσει έως και 40 MB στη συσκευή του χρήστη.
Η ρύθμιση του Bitcode γίνεται στη διαμόρφωση μεταγλώττισης του Xcode. Η παράμετρος Enable Bitcode βρίσκεται στις ρυθμίσεις Build Settings και είναι ενεργοποιημένη από προεπιλογή για νέα έργα, αλλά οι προγραμματιστές μπορούν να την απενεργοποιήσουν για αποσφαλμάτωση ή όταν χρησιμοποιούν βιβλιοθήκες τρίτων χωρίς υποστήριξη Bitcode.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// Ή μέσω Info.plist για μεμονωμένα targets
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// Έλεγχος κατάστασης Bitcode στη διαμόρφωση
if (self.enableBitcode) {
NSLog(@"Bitcode is enabled for this target");
} else {
NSLog(@"Bitcode is disabled");
}
}
Για να ελέγξετε εάν το αρχείο περιέχει Bitcode, ανοίξτε το αρχείο .xcarchive μέσω του Xcode Organizer ή εκτελέστε την εντολή otool -l στο Terminal. Η παρουσία της ενότητας __LLVM στο δυαδικό αρχείο επιβεβαιώνει ότι το Bitcode είναι ενεργοποιημένο και σωστά συσκευασμένο. Εάν η ενότητα λείπει — το Bitcode δεν δημιουργήθηκε κατά τη μεταγλώττιση.
# Έλεγχος ύπαρξης Bitcode στο αρχείο
otool -l YourApp.app/YourApp | grep __LLVM
# Αποτέλεσμα: εάν υπάρχει ενότητα __LLVM — το Bitcode υπάρχει
# Εάν το αποτέλεσμα είναι κενό — το Bitcode δεν είναι ενεργοποιημένο ή δεν δημιουργήθηκε
# Μπορεί επίσης να ελεγχθεί μέσω της εντολής size
size -m -l YourApp.app/YourApp | grep __LLVM
Όταν χρησιμοποιείτε βιβλιοθήκες τρίτων μέσω CocoaPods ή SPM, βεβαιωθείτε ότι όλες οι εξαρτήσεις έχουν μεταγλωττιστεί με Bitcode. Εάν τουλάχιστον μία βιβλιοθήκη δεν υποστηρίζει Bitcode, το Xcode θα δημιουργήσει σφάλμα σύνδεσης στο στάδιο αρχειοθέτησης. Για CocoaPods, ελέγξτε τη σημαία bitcode_enabled στα podspec ή χρησιμοποιήστε το use_frameworks! με enable_bitcode.
Bitcode δεν είναι καθολική λύση για όλους τους τύπους έργων iOS. Η τεχνολογία έχει περιορισμούς που ο προγραμματιστής πρέπει να λάβει υπόψη πριν ενεργοποιήσει την επιλογή στη διαμόρφωση μεταγλώττισης. Η κατανόηση αυτών των περιορισμών βοηθά στην αποφυγή προβλημάτων στο στάδιο αρχειοθέτησης και δημοσίευσης.
Δεν παρέχονται όλες οι βιβλιοθήκες τρίτων με υποστήριξη Bitcode. Εάν μια βιβλιοθήκη διανέμεται μόνο ως μεταγλωττισμένο δυαδικό αρχείο χωρίς Bitcode, το έργο με ενεργοποιημένη την επιλογή δεν θα μεταγλωττιστεί. Σε αυτήν την περίπτωση, ο προγραμματιστής θα πρέπει είτε να απενεργοποιήσει το Bitcode είτε να ζητήσει από τον προμηθευτή μια έκδοση με Bitcode. Αυτό είναι ιδιαίτερα σημαντικό για παλιές βιβλιοθήκες που δεν ενημερώνονται πλέον.
Αναφορές σφαλμάτων από εφαρμογές που έχουν μεταγλωττιστεί με Bitcode απαιτούν πρόσθετη επεξεργασία. Τα σύμβολα (dSYM) για τον αναμεταγλωττισμένο κώδικα δημιουργούνται από το App Store και είναι διαθέσιμα για λήψη μέσω του Xcode Organizer. Χωρίς τη λήψη των αντίστοιχων αρχείων dSYM, η στοίβα κλήσεων στις αναφορές σφαλμάτων θα είναι δυσανάγνωστη, δυσχεραίνοντας τη διάγνωση προβλημάτων.
Από iOS 17 και Xcode 15, η Apple δεν απαιτεί υποχρεωτική ενεργοποίηση του Bitcode για δημοσίευση στο App Store. Ωστόσο, για εφαρμογές watchOS, το Bitcode παραμένει υποχρεωτική προϋπόθεση που ορίζεται σε επίπεδο κανόνων του App Store Connect. Συνιστάται στους προγραμματιστές να ενεργοποιούν το Bitcode για νέα έργα, εάν όλες οι εξαρτήσεις το υποστηρίζουν.
Συχνές ερωτήσεις
Για εφαρμογές iOS και tvOS το Bitcode δεν είναι υποχρεωτικό από το Xcode 14. Για watchOS η υποστήριξη Bitcode παραμένει υποχρεωτική. Η Apple συνιστά την ενεργοποίηση του Bitcode για νέα έργα, αλλά δεν μπλοκάρει τη δημοσίευση χωρίς αυτό.
Το Bitcode επιτρέπει στο App Store να εφαρμόζει App Thinning — δημιουργία κώδικα μηχανής μόνο για την αρχιτεκτονική της συσκευής του χρήστη. Αυτό μειώνει το μέγεθος του ληφθέντος δυαδικού αρχείου κατά 15–40% ανάλογα με τον αριθμό των υποστηριζόμενων αρχιτεκτονικών στο έργο.
Ναι, τα αρχεία dSYM είναι απαραίτητα για τη συμβολοποίηση αναφορών σφαλμάτων από αναμεταγλωττισμένα δυαδικά αρχεία. Το App Store παρέχει δυνατότητα λήψης dSYM μέσω του Xcode Organizer μετά την επεξεργασία του αρχείου. Χωρίς αυτά, η στοίβα κλήσεων στο Crashlytics και στην κονσόλα θα περιέχει μόνο διευθύνσεις μνήμης.
Το SPM υποστηρίζει Bitcode εάν οι εξαρτήσεις διανέμονται σε πηγαίο κώδικα, όχι ως δυαδικά αρχεία. Οι δυαδικές εξαρτήσεις μέσω SPM πρέπει να παρέχουν έκδοση με Bitcode, διαφορετικά το έργο με ενεργοποιημένη την επιλογή δεν θα μεταγλωττιστεί.
Το Bitcode — είναι μια ανεξάρτητη από υλικό ενδιάμεση αναπαράσταση LLVM IR που δεν μπορεί να εκτελεστεί απευθείας από τον επεξεργαστή. Ο Κώδικας μηχανής περιέχει έτοιμες εντολές για συγκεκριμένη αρχιτεκτονική (arm64, x86_64) και εκτελείται χωρίς πρόσθετη μεταγλώττιση.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης