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 Converts สามารถสร้างไฟล์ไบนารีที่เพิ่มประสิทธิภาพสำหรับสถาปัตยกรรมที่แตกต่างกันจากการแสดงผลต้นฉบับเดียวกัน นี่คือข้อแตกต่างสำคัญที่กำหนดข้อดีทั้งหมดของเทคโนโลยี
| ลักษณะ | Bitcode | โค้ดเครื่อง |
|---|---|---|
| การพึ่งพาสถาปัตยกรรม | ไม่ขึ้นอยู่ | ผูกติดกับ CPU |
| ขนาดไฟล์ไบนารี | กะทัดรัด | มากกว่า |
| ความสามารถในการรีคอมไพล์ | มี | ไม่มี |
| การสนับสนุน 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-series) จะใช้การปรับแต่งความปลอดภัยเพิ่มเติม
กระบวนการนี้เรียกว่า 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
// เปิดใช้งาน Bitcode = YES
// หรือผ่าน Info.plist สำหรับแต่ละ target
@property (nonatomic, assign) BOOL enableBitcode;
- (void)configureBuildSettings {
// ตรวจสอบสถานะ Bitcode ในการกำหนดค่า
if (self.enableBitcode) {
NSLog(@"เปิดใช้งาน Bitcode สำหรับ target นี้แล้ว");
} else {
NSLog(@"ปิดใช้งาน Bitcode");
}
}
เพื่อตรวจสอบว่าไฟล์เก็บถาวรมี 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 ตรวจสอบให้แน่ใจว่า dependencies ทั้งหมดถูกสร้างด้วย Bitcode ถ้ามีไลบรารีอย่างน้อยหนึ่งตัวที่ไม่รองรับ Bitcode Xcode จะสร้างข้อผิดพลาดการลิงก์ในขั้นตอนการสร้างไฟล์เก็บถาวร สำหรับ CocoaPods ให้ตรวจสอบแฟลก bitcode_enabled ใน subspecs หรือใช้ 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 สำหรับโปรเจกต์ใหม่ ถ้า dependencies ทั้งหมดรองรับ
คำถามที่พบบ่อย
สำหรับแอปพลิเคชัน iOS และ tvOS Bitcode ไม่จำเป็นต้องมีตั้งแต่ Xcode 14 สำหรับ watchOS การสนับสนุน Bitcode ยังคงเป็นข้อบังคับ Apple แนะนำให้เปิดใช้งาน Bitcode สำหรับโปรเจกต์ใหม่ แต่ไม่ได้ปิดกั้นการเผยแพร่หากไม่มี
Bitcode ทำให้ App Store สามารถใช้ App Thinning — การสร้างโค้ดเครื่องภายใต้สถาปัตยกรรมของอุปกรณ์ผู้ใช้เท่านั้น ซึ่งช่วยลดขนาดไฟล์ไบนารีที่ดาวน์โหลดลง 15–40% ขึ้นอยู่กับจำนวนสถาปัตยกรรมที่รองรับในโปรเจกต์
ใช่ ไฟล์ dSYM จำเป็นสำหรับการทำสัญลักษณ์รายงานการคราชจากไฟล์ไบนารีที่รีคอมไพล์แล้ว App Store ให้ความสามารถในการดาวน์โหลด dSYM ผ่าน Xcode Organizer หลังจากการประมวลผลไฟล์เก็บถาวร หากไม่มี dSYM สแต็กการเรียกใน Crashlytics และ console จะมีเฉพาะที่อยู่หน่วยความจำ
SPM รองรับ Bitcode ถ้า dependencies ถูกแจกจ่ายในซอร์สโค้ดไม่ใช่ในรูปแบบไฟล์ไบนารี Binary dependencies ผ่าน SPM ต้องมีเวอร์ชันที่มี Bitcode มิฉะนั้นโปรเจกต์ที่เปิดใช้งานตัวเลือกนี้จะไม่คอมไพล์
Bitcode — คือการแสดงผลระดับกลางของ LLVM IR ที่ไม่ขึ้นกับฮาร์ดแวร์ซึ่งไม่สามารถทำงานโดยตรงบนโปรเซสเซอร์ โค้ดเครื่อง มีคำสั่งพร้อมสำหรับสถาปัตยกรรมเฉพาะ (arm64, x86_64) และทำงานโดยไม่ต้องคอมไพล์เพิ่มเติม
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม