Bitcode — نمایش میانی برنامه در مرحله کامپایل اپلیکیشن iOS است. برخلاف کد ماشین، Bitcode به معماری خاص پردازنده وابسته نیست. طبق Apple Developer Documentation، App Store میتواند Bitcode را برای معماری هدف بازکامپایل کند که عملکرد را بهبود میبخشد و اندازه فایل نصب را کاهش میدهد. توسعهدهنده Bitcode را به App Store میفرستد و فروشگاه خود فایل باینری بهینهشده را برای هر نوع دستگاه تولید میکند.
نکات اصلی
Bitcode نمایش میانی برنامه (Intermediate Representation, IR) است که زیرساخت کامپایلر LLVM تولید میکند. اپل پشتیبانی از Bitcode را از Xcode 7 و iOS 9 به عنوان الزام برای اپلیکیشنهای watchOS و اختیاری برای iOS و tvOS معرفی کرد. از Xcode 14 به بعد، الزام برای همه پلتفرمها به جز watchOS لغو شد.
مفهوم نمایش میانی کد از دهه ۲۰۰۰ در چارچوب پروژه LLVM وجود دارد که توسط کریس لتنر در دانشگاه ایلینوی تأسیس شد. اپل LLVM را در سال ۲۰۱۱ برای Xcode تطبیق داد و در سال ۲۰۱۵ 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 از فرانتاند کامپایلر شروع میشود که کد منبع Swift یا Objective-C را به LLVM IR تبدیل میکند. در مرحله لینک کردن، Xcode IR را در فایلهای فرمت .bc (Bitcode) بستهبندی میکند که سپس همراه با آرشیو .xcarchive به App Store فرستاده میشوند. 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 فراهم میکند. اصلیترین آنها — بهینهسازی خودکار برای پردازندههای جدید اپل بدون انتشار مجدد بهروزرسانی در App Store است. این به ویژه هنگام انتقال به معماریهای جدید مانند انتقال از armv7 به arm64 مهم است.
وقتی اپل پردازندهای با معماری جدید عرضه میکند، اپلیکیشنهایی که با Bitcode ارسال شدهاند به طور خودکار برای آن بازکامپایل میشوند. توسعهدهنده نیازی به بازسازی پروژه و انتشار بهروزرسانی ندارد — App Store این کار را در سمت خود هنگام اولین دانلود توسط کاربر انجام میدهد. این به ویژه برای اپلیکیشنهای طولانیمدت که سالها پشتیبانی میشوند مهم است.
App Thinning در ترکیب با Bitcode امکان کاهش اندازه اپلیکیشن نصبشده را ۱۵–۴۰٪ میدهد. App Store فقط دستورالعملهای ماشینی را تولید میکند که برای دستگاه خاص لازم است، کد معماریهای دیگر و تغییرات برای نسخههای مختلف iOS را حذف میکند. در عمل این بدان معناست که کاربر با iPhone جدید یک فایل باینری فشرده دریافت میکند.
بر اساس دادههای Apple WWDC 2015 Session 102، استفاده از Bitcode و App Thinning میتواند اندازه اپلیکیشن قابل دانلود را به طور متوسط ۲۵٪ در مقایسه با فایل باینری جهانی حاوی همه معماریها کاهش دهد. برای اپلیکیشن ۱۰۰ مگابایتی، صرفهجویی میتواند تا ۴۰ مگابایت در دستگاه کاربر باشد.
تنظیم Bitcode در پیکربندی ساخت Xcode انجام میشود. پارامتر Enable Bitcode در تنظیمات Build Settings قرار دارد و به طور پیشفرض برای پروژههای جدید فعال است، اما توسعهدهندگان میتوانند آن را برای اشکالزدایی یا هنگام استفاده از کتابخانههای شخص ثالث بدون پشتیبانی Bitcode غیرفعال کنند.
// Build Settings -> Apple Clang - Code Generation
// Enable Bitcode = YES
// یا از طریق Info.plist برای targetهای جداگانه
@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 را در podspecها بررسی کنید یا از use_frameworks! با enable_bitcode استفاده کنید.
Bitcode یک راهحل جهانی برای همه انواع پروژههای iOS نیست. این فناوری محدودیتهایی دارد که توسعهدهنده باید قبل از فعالسازی گزینه در پیکربندی ساخت در نظر بگیرد. درک این محدودیتها به جلوگیری از مشکلات در مرحله آرشیو و انتشار کمک میکند.
همه کتابخانههای شخص ثالث با پشتیبانی از Bitcode عرضه نمیشوند. اگر کتابخانه فقط به صورت فایل باینری کامپایلشده بدون Bitcode توزیع شود، پروژه با گزینه فعال ساخته نخواهد شد. در این صورت توسعهدهنده باید یا Bitcode را غیرفعال کند یا از تأمینکننده نسخه با Bitcode را درخواست کند. این به ویژه برای کتابخانههای قدیمی که دیگر بهروز نمیشوند مهم است.
گزارشهای خرابی از اپلیکیشنهایی که با Bitcode ساخته شدهاند نیاز به پردازش اضافی دارند. نمادها (dSYM) برای کد بازکامپایلشده توسط App Store تولید میشوند و برای دانلود از طریق Xcode Organizer در دسترس هستند. بدون دانلود فایلهای dSYM مربوطه، پشته فراخوانی در گزارشهای خرابی غیرقابل خواندن خواهد بود که تشخیص مشکلات را دشوار میکند.
طبق iOS 17 و Xcode 15، اپل فعالسازی اجباری Bitcode را برای انتشار در App Store الزامی نمیکند. با این حال، برای اپلیکیشنهای watchOS، Bitcode یک شرط اجباری باقی میماند که در سطح قوانین App Store Connect تعیین شده است. به توسعهدهندگان توصیه میشود Bitcode را برای پروژههای جدید فعال کنند، اگر همه وابستگیها از آن پشتیبانی میکنند.
سوالات متداول
برای اپلیکیشنهای iOS و tvOS Bitcode از Xcode 14 به بعد الزامی نیست. برای watchOS پشتیبانی Bitcode الزامی باقی میماند. اپل فعالسازی Bitcode را برای پروژههای جدید توصیه میکند، اما انتشار بدون آن را مسدود نمیکند.
Bitcode به App Store اجازه میدهد App Thinning را اعمال کند — تولید کد ماشین فقط برای معماری دستگاه کاربر. این کار اندازه فایل باینری قابل دانلود را بسته به تعداد معماریهای پشتیبانیشده در پروژه ۱۵–۴۰٪ کاهش میدهد.
بله، فایلهای dSYM برای نمادسازی گزارشهای خرابی از فایلهای باینری بازکامپایلشده ضروری هستند. App Store امکان دانلود dSYM را از طریق Xcode Organizer پس از پردازش آرشیو فراهم میکند. بدون آنها، پشته فراخوانی در Crashlytics و کنسول فقط شامل آدرسهای حافظه خواهد بود.
SPM در صورتی که وابستگیها به صورت کد منبع توزیع شوند نه فایلهای باینری، از Bitcode پشتیبانی میکند. وابستگیهای باینری از طریق SPM باید نسخهای با Bitcode ارائه دهند، در غیر این صورت پروژه با گزینه فعال کامپایل نخواهد شد.
Bitcode — یک نمایش میانی LLVM IR مستقل از سختافزار است که نمیتواند مستقیماً توسط پردازنده اجرا شود. کد ماشین شامل دستورالعملهای آماده برای معماری خاص (arm64, x86_64) است و بدون کامپایل اضافی اجرا میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید