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.
مفهوم التمثيل الوسيط للكود موجود منذ العقد الأول من القرن الحادي والعشرين كجزء من مشروع LLVM، الذي أسسه كريس لاتنر في جامعة إلينوي. قامت Apple بتكييف LLVM لـ Xcode في 2011، وفي 2015 قدمت Bitcode كوسيلة لتحديث التطبيقات دون إعادة إرسالها إلى App Store. تم الإعلان عن التقنية في WWDC 2015 في جلسة «What's New in Xcode».
الكود الآلي هو تعليمات ثنائية لمعالج محدد: arm64 أو armv7 أو x86_64. يتم تخزين Bitcode بتنسيق مستقل عن العتاد، مما يسمح لـ App Store بإنشاء ملفات ثنائية محسنة لهندسات مختلفة من تمثيل مصدر واحد. هذا الفرق الرئيسي يحدد جميع مزايا التقنية.
| الخاصية | Bitcode | الكود الآلي |
|---|---|---|
| الاعتماد على الهندسة | مستقل | مرتبط بالمعالج |
| حجم الملف الثنائي | مضغوط | أكبر |
| إمكانية إعادة التجميع | نعم | لا |
| دعم App Store | يعاد تجميعه | يُستخدم كما هو |
| التصحيح | محدود | دعم كامل |
Bitcode ليس ملفًا قابلًا للتنفيذ. إنه LLVM IR بتنسيق ثنائي يرسله المطور إلى App Store مع بيانات وصفية للمشروع. يقوم متجر التطبيقات بتشغيل عملية إعادة التجميع، مكيّفًا الكود لكل منصة مستهدفة وإصدار نظام تشغيل.
عملية إنشاء Bitcode تبدأ مع الواجهة الأمامية للمترجم، التي تحول كود مصدر Swift أو Objective-C إلى LLVM IR. في مرحلة الربط، يقوم Xcode بتعبئة IR في ملفات بتنسيق .bc (Bitcode)، والتي تُرسل بعد ذلك إلى App Store مع ملف .xcarchive. App Store بدوره يقوم بتشغيل عملية إعادة التجميع على جانبه.
البنية التحتية لـ LLVM تتكون من ثلاثة أجزاء: الواجهة الأمامية (Clang لـ C/ObjC، Swift Frontend لـ Swift)، المحسن Middle-End، والواجهة الخلفية (مولد الكود الآلي). Bitcode هو نتيجة المرحلتين الأوليين دون الانتقال إلى توليد تعليمات التجميع. يقوم Middle-End بتنفيذ تحسينات مستقلة عن المنصة: إزالة الكود الميت، التضمين، وطي الثوابت.
// مثال على كود 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، يقوم المترجم بتنفيذ سلسلة من التحسينات على مستوى التمثيل: إزالة الكود الميت، تضمين الدوال، وطي الثوابت. هذه التحسينات مستقلة عن الهندسة المعمارية ويتم الاحتفاظ بها في 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 ميجابايت، يمكن أن يصل التوفير إلى 40 ميجابايت على جهاز المستخدم.
إعداد Bitcode يتم في إعدادات بناء Xcode. توجد معلمة Enable Bitcode في إعدادات Build Settings وهي مفعلة افتراضيًا للمشاريع الجديدة، لكن يمكن للمطورين تعطيلها للتصحيح أو عند استخدام مكتبات طرف ثالث بدون دعم Bitcode.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// أو عبر Info.plist للأهداف الفردية
@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 في الطرفية. وجود قسم __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 في المواصفات الفرعية أو استخدم 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. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا