ผลกระทบของตัวเลือกการสร้าง Xcode“ เปิดใช้งานบิตโค้ด” ใช่ / ไม่ใช่


239

เมื่อวานนี้ฉันจำคำเตือนมากมายเกี่ยวกับห้องสมุด parse.com:

ด่วน: บิตโค้ดทั้งหมดจะลดลงเนื่องจาก '[เส้นทาง] /Parse.framework/Parse (PFAnalytics.o)' ถูกสร้างขึ้นโดยไม่มีบิตโค้ด คุณต้องสร้างใหม่ด้วยการเปิดใช้งานบิตโค้ด (การตั้งค่า Xcode ENABLE_BITCODE) ขอรับไลบรารีที่อัปเดตจากผู้ขายหรือปิดใช้งานบิตโค้ดสำหรับเป้าหมายนี้ หมายเหตุ: นี่จะเป็นข้อผิดพลาดในอนาคต

ฉันตระหนักถึงความจริงที่ว่าฉันสามารถลบคำเตือนเหล่านั้นด้วยคำตอบนี้แต่ตอนนี้ฉันสงสัยว่ามันจะมีผลกระทบเชิงลบเกี่ยวกับการส่ง AppStore และ / หรือประสิทธิภาพที่แท้จริงของแอปของฉัน

Xcode แจ้งให้คุณทราบเกี่ยวกับบิตโค้ด

การเปิดใช้งานการตั้งค่านี้บ่งชี้ว่าเป้าหมายหรือโครงการควรสร้างบิตโค้ดระหว่างการรวบรวมสำหรับแพลตฟอร์มและสถาปัตยกรรมที่รองรับ สำหรับบิลด์บิวด์บิทโค้ดจะถูกสร้างขึ้นในไบนารีที่เชื่อมโยงเพื่อส่งไปยังแอพสโตร์ สำหรับบิลด์อื่น ๆ คอมไพเลอร์และลิงเกอร์จะตรวจสอบว่ารหัสเป็นไปตามข้อกำหนดสำหรับการสร้างบิตโค้ดหรือไม่ แต่จะไม่สร้างบิทโค้ดจริง [ENABLE_BITCODE]

แต่ฉันไม่ได้รับข้อมูลที่เป็นประโยชน์จริงๆจากข้อความนี้

  • ฉันสามารถใช้คำตอบที่เชื่อมโยงเพื่อหลีกเลี่ยงปัญหานี้โดยไม่มีผลกระทบด้านลบและไม่ส่งผลต่อการส่ง AppStore ในอนาคตได้หรือไม่?
  • สิ่งที่ENABLE_BITCODEทำจริงจะเป็นข้อกำหนดที่ไม่จำเป็นในอนาคตหรือไม่?
  • มีผลกระทบต่อประสิทธิภาพการทำงานหรือไม่หากฉันเปิด / ปิดการใช้งาน

คำตอบ:


399
  • ENABLE_BITCODE ทำอะไรจริง ๆ แล้วจะเป็นข้อกำหนดที่ไม่มีทางเลือกในอนาคตหรือไม่

ฉันไม่แน่ใจในระดับที่คุณกำลังมองหาคำตอบดังนั้นลองมาเที่ยวกันหน่อย บางส่วนนี้คุณอาจรู้อยู่แล้ว

เมื่อคุณสร้างโครงการ Xcode จะเรียกใช้clangเป้าหมาย Objective-C และswift/ swiftcสำหรับ Swift เป้าหมาย คอมไพเลอร์ทั้งสองนี้รวบรวมแอปไปยังสื่อกลาง (IR) หนึ่งใน IRS เหล่านี้คือบิตโค้ด จาก IR นี้โปรแกรมที่ชื่อว่า LLVM จะเข้าควบคุมและสร้างไบนารีที่จำเป็นสำหรับโหมด x86 32 และ 64 บิต (สำหรับเครื่องจำลอง) และ arm6 / arm7 / arm7s / arm64 (สำหรับอุปกรณ์) โดยปกติไบนารีที่แตกต่างกันทั้งหมดเหล่านี้จะรวมเข้าด้วยกันในไฟล์เดียวที่เรียกว่าไบนารีไขมันไบนารีไขมัน

ตัวเลือก ENABLE_BITCODE ตัดขั้นตอนสุดท้ายนี้ออก มันสร้างเวอร์ชันของแอปด้วยไบนารีบิตเรต IR มันมีคุณสมบัติที่ดีมากมาย แต่มีข้อเสียอย่างหนึ่งคือมันไม่สามารถทำงานได้ทุกที่ ในการรับแอปที่มีไบนารีบิตโค้ดให้เรียกใช้บิตโค้ดจะต้องทำการคอมไพล์ใหม่ (อาจประกอบหรือแปลงรหัส ... ฉันไม่แน่ใจว่าคำกริยาที่ถูกต้อง ) เป็น x86 หรือ ARM

เมื่อส่งแอพ bitcode ไปยัง App Store แล้ว Apple จะทำขั้นตอนสุดท้ายนี้และสร้างไบนารีเสร็จ

ตอนนี้แอป bitcode เป็นทางเลือก แต่ประวัติศาสตร์แสดงให้เห็นว่า Apple เปลี่ยนสิ่งที่เป็นตัวเลือกให้เป็นข้อกำหนด (เช่นรองรับ 64 บิต) โดยปกติจะใช้เวลาสองสามปีดังนั้นนักพัฒนาบุคคลที่สาม (เช่นการแยกวิเคราะห์) จึงมีเวลาอัปเดต

  • ฉันสามารถใช้วิธีการด้านบนได้โดยไม่มีผลกระทบด้านลบและไม่ส่งผลต่อการส่ง appstore ในอนาคตหรือไม่

ใช่คุณสามารถปิด ENABLE_BITCODE และทุกอย่างจะทำงานเหมือนเดิม จนกว่า Apple จะกำหนดให้แอป bitcode เป็นข้อกำหนดสำหรับ App Store คุณจะไม่เป็นไร

  • มีผลกระทบต่อประสิทธิภาพการทำงานหรือไม่หากฉันเปิด / ปิดการใช้งาน

จะไม่มีผลกระทบด้านลบต่อการเปิดใช้งาน แต่การกระจายแอพภายในสำหรับการทดสอบอาจมีความซับซ้อนมากขึ้น

สำหรับผลกระทบเชิงบวก…ก็ซับซ้อน

สำหรับการจัดจำหน่ายใน App Store แอปเปิ้ลจะสร้างแอพของคุณแยกต่างหากสำหรับสถาปัตยกรรมแต่ละเครื่อง (arm6 / arm7 / arm7s / arm64) แทนแอพเดียวที่มีเลขฐานสอง ซึ่งหมายความว่าแอพที่ติดตั้งบนอุปกรณ์ iOS จะเล็กลง

นอกจากนี้เมื่อบิตโค้ดถูกคอมไพล์ใหม่ ( อาจจะประกอบหรือแปลงรหัส ... อีกครั้งฉันไม่แน่ใจว่าคำกริยาที่ถูกต้อง ) มันถูกปรับให้เหมาะสม LLVM ทำงานอยู่เสมอในการสร้างการเพิ่มประสิทธิภาพที่ดีขึ้น ตามทฤษฎีแล้ว App Store สามารถสร้างแอปแยกต่างหากในแอพสโตร์ได้ด้วย LLVM รุ่นใหม่แต่ละครั้งดังนั้นแอปของคุณจะได้รับการปรับให้เหมาะสมที่สุดด้วยเทคโนโลยี LLVM ล่าสุด


19
"Apple จะสร้างแอปของคุณแยกต่างหากสำหรับสถาปัตยกรรมแต่ละเครื่อง (arm6 / arm7 / arm7s / arm64) แทนที่จะเป็นหนึ่งแอพที่มีเลขฐานสองอ้วนหมายความว่าแอปที่ติดตั้งบนอุปกรณ์ iOS จะเล็กลง" นั่นคือสิ่งที่ Slicing ทำ สิ่งนี้ไม่เกี่ยวข้องกับ Bitcode
user102008

10
"ตัวเลือก ENABLE_BITCODE ตัดขั้นตอนสุดท้ายนี้ออก" มันไม่ได้ตัดขั้นตอนใด ๆ สถาปัตยกรรมไบนารีทั้งหมดยังคงผลิตอยู่ จากนั้นจะเพิ่มข้อมูลบิตโค้ด PLUS สำหรับสถาปัตยกรรม EACH ดูstackoverflow.com/a/31030741/102008
user102008

6
ดูที่developer.apple.com/library/prerelease/watchos/documentation/?hl=th "การแบ่งเป็นกระบวนการสร้างและส่งชุดตัวเลือกแอปสำหรับอุปกรณ์เป้าหมายที่แตกต่างกันตัวแปรมีเฉพาะสถาปัตยกรรมที่ปฏิบัติการได้และทรัพยากรที่จำเป็นสำหรับเป้าหมาย อุปกรณ์."
user102008

7
ไม่ใช่ข้อความจริงที่การเปิดใช้งาน Bitcode จะทำให้แอปที่ติดตั้งบนอุปกรณ์มีขนาดเล็กลงเมื่อเทียบกับเมื่อปิดการใช้งาน Bitcode ไม่มีที่ไหนพูดได้
user102008

7
@ onmyway133 ผู้ให้บริการบางรายไม่ให้แหล่งที่มา หากผู้ให้บริการทั้งหมดจัดเตรียมเป็นไฟล์ lib และส่วนหัวแบบคงที่ (หรือ Framework) ผู้จำหน่ายจะต้องรวบรวมข้อมูลของตนด้วยการเปิดใช้งานบิตโค้ด
Jeffery Thomas

65

ตรวจสอบให้แน่ใจว่าได้เลือก "ทั้งหมด" เพื่อค้นหาการเปิดใช้งานการตั้งค่าบิทโค้ด:

สร้างการตั้งค่า


35

Bitcode เป็นคุณสมบัติใหม่ของiOS 9

Bitcode เป็นการแสดงสื่อกลางของโปรแกรมที่คอมไพล์แล้ว แอพที่คุณอัปโหลดไปยัง iTunes Connect ที่มีบิตโค้ดจะถูกรวบรวมและลิงก์ใน App Store การรวมบิตโค้ดจะช่วยให้แอปเพิ่มประสิทธิภาพไบนารีแอปของคุณอีกครั้งในอนาคตโดยไม่จำเป็นต้องส่งแอพเวอร์ชันใหม่ของคุณไปที่ร้าน

หมายเหตุ: สำหรับแอป iOS บิตโค้ดเป็นค่าเริ่มต้น แต่เป็นตัวเลือก หากคุณระบุบิตโค้ดแอพและกรอบงานทั้งหมดในชุดแอปจะต้องมีบิตโค้ด สำหรับแอพ watchOS จำเป็นต้องมีบิตโค้ด

ดังนั้นคุณควรปิดการใช้งานบิตโค้ดจนกว่าเฟรมเวิร์กทั้งหมดในแอพของคุณจะเปิดใช้งานบิตโค้ด


'เพิ่มประสิทธิภาพไบนารีแอปของคุณอีกครั้งในอนาคต' - คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม
genaks

นี่มันบอกว่า: "Bitcode เป็นคุณลักษณะใหม่ของ iOS 9" และ "[... ] สำหรับแอพ watchOS ต้องใช้บิตโค้ด [... ]" ถ้าฉันต้องการสร้างแอพ WatchOS ใน iOS 8 ล่ะ
superpuccio

33

Bitcode ทำรายงานความผิดพลาดยาก นี่เป็นคำพูดจากHockeyApp (ซึ่งเป็นจริงสำหรับโซลูชันการรายงานข้อขัดข้องอื่น ๆ ):

เมื่ออัปโหลดแอปไปยัง App Store และเปิดใช้งานช่องทำเครื่องหมาย "Bitcode" Apple จะใช้ Bitcode ที่สร้างและรวบรวมใหม่ในตอนท้ายก่อนที่จะแจกจ่ายไปยังอุปกรณ์ ซึ่งจะส่งผลให้ไบนารีรับ UUID ใหม่และมีตัวเลือกในการดาวน์โหลด dSYM ที่สอดคล้องกันผ่าน Xcode

หมายเหตุ: คำตอบถูกแก้ไขในเดือนมกราคม 2559 เพื่อให้สอดคล้องกับการเปลี่ยนแปลงล่าสุด


2
ระหว่างเดือนกันยายนถึงธันวาคมสิ่งนี้ได้รับการแก้ไขผ่านตัวเลือกการส่งออก Xcode Organizer ใหม่ (ดูการอัปเดตใน HA วิธีการที่ยกมา) และแตกอีกครั้ง (ดูคำถาม HA ที่แก้ไขแล้วของฉัน)
Pavel Zdenek

13

@ vj9 ขอบคุณ ฉันอัปเดตเป็น xcode 7 มันแสดงให้ฉันเห็นข้อผิดพลาดเดียวกัน สร้างได้ดีหลังจากตั้งค่า "ไม่"

ป้อนคำอธิบายรูปภาพที่นี่

ตั้ง "ไม่" มันทำงานได้ดี

ป้อนคำอธิบายรูปภาพที่นี่


1
@Septronic หากคุณต้องการเลือกใช่ คุณต้องตรวจสอบกรอบที่สามทั้งหมดของคุณสนับสนุนสิ่งนี้
zszen

เป้าหมายเวอร์ชันขั้นต่ำที่ iOS รองรับนั้นต้องเป็น iOS 6 หรือสูงกว่า
คิด

9

ที่นี่คุณสามารถค้นหาวิธีแก้ปัญหาทั้งหมดเกี่ยวกับBitcode

ตามเอกสารของ Apple Doc

Bitcode เป็นการแสดงสื่อกลางของโปรแกรมที่คอมไพล์แล้ว แอพที่คุณอัปโหลดไปยัง iTunes Connect ที่มีบิตโค้ดจะถูกรวบรวมและเชื่อมโยงกับร้านค้า การรวมบิตโค้ดจะช่วยให้แอปเพิ่มประสิทธิภาพไบนารีแอปของคุณอีกครั้งในอนาคตโดยไม่จำเป็นต้องส่งแอพเวอร์ชันใหม่ของคุณไปที่ร้าน

Xcode ซ่อนสัญลักษณ์ที่สร้างขึ้นในระหว่างการสร้างตามค่าเริ่มต้นดังนั้น Apple จะไม่สามารถอ่านได้ เฉพาะในกรณีที่คุณเลือกที่จะรวมสัญลักษณ์เมื่ออัปโหลดแอปของคุณไปยัง iTunes Connect สัญลักษณ์นั้นจะถูกส่งไปยัง Apple คุณต้องรวมสัญลักษณ์เพื่อรับรายงานข้อขัดข้องจาก Apple

หมายเหตุ:สำหรับแอป iOS บิตโค้ดเป็นค่าเริ่มต้น แต่เป็นตัวเลือก สำหรับแอพ watchOS และ tvOS จำเป็นต้องมีบิตโค้ด หากคุณระบุบิตโค้ดแอพและกรอบงานทั้งหมดในชุดแอป (เป้าหมายทั้งหมดในโครงการ) จะต้องมีบิตโค้ดด้วย หลังจากคุณเผยแพร่แอพของคุณโดยใช้ iTunes Connect คุณสามารถดาวน์โหลดไฟล์ dSYMs สำหรับบิลด์ตามที่อธิบายในการดูและการนำเข้าข้อขัดข้องในหน้าต่างอุปกรณ์

การปล่อย bitcode และการทำให้ผอมบางของแอปเปิลเริ่มต้นแล้วของ Apple ถูกระงับไว้เนื่องจากปัญหาในการอัปเกรดจากฮาร์ดแวร์ประเภทหนึ่งไปเป็นฮาร์ดแวร์ชนิดอื่นไม่ได้เรียกคืนไบนารีรุ่นที่ถูกต้อง ปัญหานี้ได้รับการแก้ไขในภายหลังด้วย iOS 9.0.2 และเปิดใช้งานคุณลักษณะอีกครั้ง

Bitcode เป็นส่วนหนึ่งของ LLVM คอมไพล์และเฟสการปรับให้เหมาะสมเสมอ แต่ด้วยการย้ายโลจิกแบ็คเอนด์ไปยังเซิร์ฟเวอร์ Apple มันจะย้ายออปติไมซ์และรวบรวมเฟสจากช่วงเวลารวบรวมนักพัฒนาไปสู่การปรับใช้ App Store สิ่งนี้จะปลดล็อคศักยภาพของการเพิ่มประสิทธิภาพใหม่หรือการแปลใหม่ในอนาคตเพื่อรองรับโปรเซสเซอร์ใหม่และเร็วกว่าในอนาคต จำเป็นต้องมีการปรับใช้ Bitcode สำหรับการฝากตัวแทน watchOS และ tvOS และสามารถเปิดใช้งานแบบมีเงื่อนไขสำหรับการปรับใช้ iOS ที่มีอยู่ด้วยตัวเลือก "เปิดใช้งาน Bitcode" ในการตั้งค่าโครงการ สิ่งนี้จะเพิ่มแฟล็ก embed-bitcode-marker สำหรับ debug builds และ embed-bitcode สำหรับการสร้างไฟล์เก็บถาวร / อุปกรณ์ สิ่งเหล่านี้สามารถถูกส่งผ่านไปยังคอมไพเลอร์ Swift ด้วย -embed-bitcode หรือโดยการใช้ clang กับ -fembed-bitcode

บิตโค้ดยังมีข้อเสียนักพัฒนาสามารถดีบักรายงานข้อขัดข้องจากแอปพลิเคชันโดยจัดเก็บสำเนาสัญลักษณ์แก้ปัญหาที่สอดคล้องกับไบนารีที่จัดส่งไปยัง Apple เมื่อเกิดความผิดพลาดในสแต็กที่กำหนดนักพัฒนาสามารถคืนค่าการติดตามสแต็กเดิมโดยเป็นสัญลักษณ์ของรายงานความผิดพลาดโดยใช้สัญลักษณ์ดีบักเหล่านี้ อย่างไรก็ตามสัญลักษณ์เป็นผลพลอยได้จากการแปลฟอร์มกลางเป็นไบนารี แต่ถ้าขั้นตอนนั้นทำบนเซิร์ฟเวอร์ข้อมูลนี้จะหายไป Apple จัดให้มีบริการรายงานข้อขัดข้องที่สามารถเล่นได้ในส่วนของดีบักเกอร์โดยที่นักพัฒนาซอฟต์แวร์ได้อัปโหลดสัญลักษณ์การดีบัก ณ เวลาที่เผยแพร่แอปพลิเคชัน ความจริงที่ว่านักพัฒนาไม่เคยเห็นเลขฐานสองที่แน่นอนหมายความว่าพวกเขาอาจไม่สามารถทดสอบปัญหาที่เฉพาะเจาะจงเป็นฮาร์ดแวร์ใหม่วิวัฒนาการ

ในที่สุดสามารถแปลbitcodeบนเซิร์ฟเวอร์เพื่อสนับสนุนสถาปัตยกรรมและชุดคำสั่งใหม่เมื่อวิวัฒนาการ หากว่าพวกเขารักษาระเบียบการประชุมและขนาดของการจัดตำแหน่งและคำแอปพลิเคชันบิตโค้ดอาจถูกแปลเป็นสถาปัตยกรรมประเภทต่างๆและปรับให้เหมาะสมสำหรับโปรเซสเซอร์ใหม่โดยเฉพาะ หากใช้ไลบรารีมาตรฐานสำหรับรูทีนคณิตศาสตร์และเวกเตอร์ไลบรารีเหล่านี้สามารถปรับให้เหมาะกับคำสั่งเฉพาะเวกเตอร์ของโปรเซสเซอร์เพื่อให้ได้ประสิทธิภาพที่ดีที่สุดสำหรับแอปพลิเคชันที่กำหนด เครื่องมือเพิ่มประสิทธิภาพอาจสร้างการเข้ารหัสที่แตกต่างกันและการตัดสินตามขนาดหรือความเร็วในการดำเนินการ

สำหรับข้อมูลเพิ่มเติมกรุณาตรวจสอบที่นี่และที่นี่


6

จากเอกสาร

  • ฉันสามารถใช้วิธีการด้านบนได้โดยไม่มีผลกระทบด้านลบและไม่ส่งผลต่อการส่ง appstore ในอนาคตหรือไม่

บิตโค้ดจะช่วยให้แอปเปิ้ลเพิ่มประสิทธิภาพแอปโดยที่คุณไม่ต้องส่งบิลด์ใหม่ แต่คุณสามารถเปิดใช้งานคุณลักษณะนี้ได้เฉพาะเมื่อเฟรมเวิร์กและแอพทั้งหมดในชุดแอพเปิดใช้งานคุณลักษณะนี้ การมีมันช่วยได้ แต่การไม่มีมันไม่ควรมีผลกระทบด้านลบใด ๆ

  • ENABLE_BITCODE ทำอะไรจริง ๆ แล้วจะเป็นข้อกำหนดที่ไม่มีทางเลือกในอนาคตหรือไม่

สำหรับแอป iOS บิตโค้ดเป็นค่าเริ่มต้น แต่เป็นตัวเลือก หากคุณระบุบิตโค้ดแอพและกรอบงานทั้งหมดในชุดแอปจะต้องมีบิตโค้ด สำหรับแอพ watchOS จำเป็นต้องมีบิตโค้ด

  • มีผลกระทบต่อประสิทธิภาพการทำงานหรือไม่หากฉันเปิด / ปิดการใช้งาน

App Store และระบบปฏิบัติการปรับการติดตั้ง iOS และแอพ watchOS ให้เหมาะสมโดยปรับการจัดส่งแอพให้เป็นไปตามความสามารถของอุปกรณ์เฉพาะของผู้ใช้โดยใช้พื้นที่น้อยที่สุด การเพิ่มประสิทธิภาพนี้เรียกว่าการทำให้ผอมบางแอพช่วยให้คุณสร้างแอพที่ใช้คุณสมบัติอุปกรณ์ส่วนใหญ่ใช้พื้นที่ดิสก์ขั้นต่ำและรองรับการอัปเดตในอนาคตที่ Apple สามารถนำไปใช้ได้ การดาวน์โหลดที่เร็วขึ้นและพื้นที่มากขึ้นสำหรับแอพและเนื้อหาอื่น ๆ จะให้ประสบการณ์ผู้ใช้ที่ดียิ่งขึ้น

ไม่ควรมีผลกระทบด้านประสิทธิภาพใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.