ENABLE_BITCODE ทำอะไรใน xcode 7


262

ฉันมีปัญหากับคำ bitcode ในตัว
บิตโค้ดแบบฝังคืออะไร
เมื่อใดจึงจะเปิดใช้งานENABLE_BITCODEใน Xcode ใหม่
จะเกิดอะไรขึ้นกับไบนารีเมื่อเปิดใช้งานENABLE_BITCODEใน Xcode 7

คำตอบ:


312

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

ความแตกต่างนี้จาก: Slicingซึ่งเป็นกระบวนการของแอปเปิ้ลเพิ่มประสิทธิภาพของแอปสำหรับอุปกรณ์ของผู้ใช้ขึ้นอยู่กับความละเอียดของอุปกรณ์และสถาปัตยกรรม การแบ่งส่วนไม่จำเป็นต้องใช้ Bitcode (เช่น: รวมเฉพาะ @ 2x images บน 5s)

App Thinningคือการรวมกันของการแบ่งส่วน, บิตโค้ดและทรัพยากรตามความต้องการ

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

เอกสารประกอบของ Apple ใน App Thinning


ไม่มีสิ่งใดในสิ่งที่คุณยกมากล่าวว่าการเปิดใช้งานบิตโค้ดลดขนาดของแอพในอุปกรณ์ของผู้ใช้ Bitcode ไม่มีส่วนเกี่ยวข้องกับทรัพยากรเช่น 3x หรือ 2x
user102008

1
ทรัพยากรต่าง ๆ ไม่เกี่ยวข้องกับ Bitcode ซึ่งเป็นเรื่องเกี่ยวกับรหัส การดาวน์โหลดโดยผู้ใช้ของสถาปัตยกรรมโค้ดบางตัวเท่านั้นและทรัพยากรบางรุ่นคือการแบ่งส่วนซึ่งไม่เกี่ยวข้องกับ Bitcode
user102008

7
ฉันไม่เห็นด้วยที่อนุญาตให้ Apple ลดขนาดแอปของคุณ ไม่มีที่ไหนพูดได้ มีข้อความแจ้งว่า "จะอนุญาตให้แอปเพิ่มประสิทธิภาพไบนารีแอปของคุณอีกครั้งในอนาคตโดยไม่จำเป็นต้องส่งแอปเวอร์ชันใหม่ของคุณไปที่ร้าน" ซึ่งฉันใช้หมายความว่ามันอนุญาตให้ Apple รวบรวมแอปของคุณใหม่สำหรับสถาปัตยกรรมใหม่ได้ อุปกรณ์ใหม่ที่มีสถาปัตยกรรมใหม่ออกมาโดยที่คุณไม่จำเป็นต้องส่งเวอร์ชันใหม่ที่มีสถาปัตยกรรมนี้
user102008

2
ไม่การแบ่งกำลังแบ่งทรัพยากรแอปของคุณออกเป็นกลุ่มสำหรับอุปกรณ์เฉพาะ Bitcode เป็นสิ่งที่ช่วยให้ Apple สามารถสร้างปฏิบัติการสำหรับสถาปัตยกรรมเฉพาะ
Jon Shier

2
@JonShier Apple กล่าวว่า "การแบ่งเป็นกระบวนการสร้างและส่งชุดตัวแปรของแอปพลิเคชันสำหรับอุปกรณ์เป้าหมายที่แตกต่างกันตัวแปรมีเฉพาะสถาปัตยกรรมที่สามารถใช้งานได้และทรัพยากรที่จำเป็นสำหรับอุปกรณ์เป้าหมาย" ดังนั้นการแบ่งส่วนจึงมีเพียงรหัสปฏิบัติการและทรัพยากร สำหรับอุปกรณ์บางอย่าง
keji

80

บิตโค้ดแบบฝังคืออะไร

ตามเอกสาร :

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

ปรับปรุง:วลีในนี้"คุณสมบัติใหม่ใน Xcode 7"ทำให้ผมคิดว่าเป็นเวลานานที่Bitcodeเป็นสิ่งจำเป็นสำหรับหั่นเพื่อลดขนาดของแอป:

เมื่อคุณเก็บถาวรเพื่อส่งไปยัง App Store Xcode จะรวบรวมแอปของคุณเป็นตัวแทนระดับกลาง จากนั้น App Store จะรวบรวมบิตโค้ดลงในไฟล์เรียกทำงาน 64 หรือ 32 บิตตามความจำเป็น

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

Bitcodeอนุญาตให้ส่วนประกอบApp Thinningอื่น ๆ ที่เรียกว่าการหั่นเพื่อสร้างชุดข้อมูลแอปที่มีไฟล์ปฏิบัติการเฉพาะสำหรับสถาปัตยกรรมเฉพาะเช่น iPhone 5S จะรวมเฉพาะปฏิบัติการที่มีแขน 64, iPad Mini armv7 และอื่น ๆ

เมื่อใดจึงจะเปิดใช้งาน ENABLE_BITCODE ใน Xcode ใหม่

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

จะเกิดอะไรขึ้นกับไบนารีเมื่อ ENABLE_BITCODE เปิดใช้งานใน Xcode ใหม่

จากการอ้างอิง Xcode 7:

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

ต่อไปนี้เป็นลิงค์สองสามข้อที่จะช่วยให้คุณเข้าใจBitcode ได้มากขึ้น :


บิตโค้ดจะรวมอยู่หรือไม่หากฉันมี ENABLE_BITCODE แต่ไม่ต้องเลือก "รวมบิตโค้ด" ก่อนส่งไปยัง App Store
อัลแลร์

"สำหรับแอป iOS บิตโค้ดเป็นค่าเริ่มต้น แต่เป็นตัวเลือก" ฮะ..? มาอีกครั้ง..? มันเป็นหรือไม่ใช่ตัวเลือก .. ?
NpC0mpl3t3

@ NpC0mpl3t3 ตามที่ระบุไว้ในคำตอบมันเป็นตัวเลือกสำหรับแอพ iOS แต่จำเป็นสำหรับแอพ watchOS และ tvOS
Maxim Pavlov

ความช่วยเหลือที่ยอดเยี่ยม! คำตอบที่นี่จะแสดงวิธีปิดการใช้งาน bitcode: stackoverflow.com/a/41418824/9190
Guerry

20

เนื่องจากคำถามที่แน่นอนคือ "สิ่งที่เปิดใช้งาน bitcode ทำ" ฉันต้องการให้รายละเอียดทางเทคนิคบางอย่างที่ฉันเข้าใจได้ ส่วนใหญ่เป็นไปไม่ได้ที่จะเข้าใจความแน่นอน 100% จนกว่า Apple จะเผยแพร่ซอร์สโค้ดสำหรับคอมไพเลอร์นี้

ครั้งแรก bitcode แอปเปิ้ลไม่ได้ปรากฏจะเป็นสิ่งเดียวกับ LLVM bytecode อย่างน้อยฉันก็ไม่สามารถเข้าใจความคล้ายคลึงระหว่างพวกเขาได้ ดูเหมือนว่าจะมีส่วนหัวที่เป็นกรรมสิทธิ์ (เริ่มต้นด้วย "xar!" เสมอ) และอาจเป็นเวทย์มนตร์อ้างอิงลิงค์เวลาที่ป้องกันการทำซ้ำข้อมูล หากคุณเขียนสตริง hardcoded สตริงนี้จะถูกใส่ลงในข้อมูลเพียงครั้งเดียวแทนที่จะเป็นสองเท่าตามที่คาดไว้หากเป็น bytecode LLVM ปกติ

ประการที่สองบิตโค้ดไม่ได้ส่งจริง ๆ ในไฟล์เก็บถาวรไบนารีเป็นสถาปัตยกรรมที่แยกกันอย่างที่คาดไว้ มันไม่ได้จัดส่งในลักษณะเดียวกับที่พูดว่า x86 และ ARM จะใส่ลงในหนึ่งไบนารี (ไฟล์เก็บถาวร FAT) แต่จะใช้ส่วนพิเศษในไบนารี MachO เฉพาะสถาปัตยกรรมที่ชื่อ "__LLVM" ซึ่งมาพร้อมกับทุกสถาปัตยกรรมที่รองรับ (เช่นทำซ้ำ) ฉันคิดว่านี่เป็นช่วงสั้น ๆ ที่มาพร้อมกับระบบคอมไพเลอร์และอาจได้รับการแก้ไขในอนาคตเพื่อหลีกเลี่ยงการซ้ำซ้อน

รหัส C (รวบรวมด้วยclang -fembed-bitcode hi.c -S -emit-llvm):

#include <stdio.h>

int main() {
    printf("hi there!");
    return 0;
}

LLVM เอาต์พุต IR:

; ModuleID = '/var/folders/rd/sv6v2_f50nzbrn4f64gnd4gh0000gq/T/hi-a8c16c.bc'
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"

@.str = private unnamed_addr constant [10 x i8] c"hi there!\00", align 1
@llvm.embedded.module = appending constant [1600 x i8] c"\DE\C0\17\0B\00\00\00\00\14\00\00\00$\06\00\00\07\00\00\01BC\C0\DE!\0C\00\00\86\01\00\00\0B\82 \00\02\00\00\00\12\00\00\00\07\81#\91A\C8\04I\06\1029\92\01\84\0C%\05\08\19\1E\04\8Bb\80\10E\02B\92\0BB\84\102\148\08\18I\0A2D$H\0A\90!#\C4R\80\0C\19!r$\07\C8\08\11b\A8\A0\A8@\C6\F0\01\00\00\00Q\18\00\00\C7\00\00\00\1Bp$\F8\FF\FF\FF\FF\01\90\00\0D\08\03\82\1D\CAa\1E\E6\A1\0D\E0A\1E\CAa\1C\D2a\1E\CA\A1\0D\CC\01\1E\DA!\1C\C8\010\87p`\87y(\07\80p\87wh\03s\90\87ph\87rh\03xx\87tp\07z(\07yh\83r`\87th\07\80\1E\E4\A1\1E\CA\01\18\DC\E1\1D\DA\C0\1C\E4!\1C\DA\A1\1C\DA\00\1E\DE!\1D\DC\81\1E\CAA\1E\DA\A0\1C\D8!\1D\DA\A1\0D\DC\E1\1D\DC\A1\0D\D8\A1\1C\C2\C1\1C\00\C2\1D\DE\A1\0D\D2\C1\1D\CCa\1E\DA\C0\1C\E0\A1\0D\DA!\1C\E8\01\1D\00s\08\07v\98\87r\00\08wx\876p\87pp\87yh\03s\80\876h\87p\A0\07t\00\CC!\1C\D8a\1E\CA\01 \E6\81\1E\C2a\1C\D6\A1\0D\E0A\1E\DE\81\1E\CAa\1C\E8\E1\1D\E4\A1\0D\C4\A1\1E\CC\C1\1C\CAA\1E\DA`\1E\D2A\1F\CA\01\C0\03\80\A0\87p\90\87s(\07zh\83q\80\87z\00\C6\E1\1D\E4\A1\1C\E4\00 \E8!\1C\E4\E1\1C\CA\81\1E\DA\C0\1C\CA!\1C\E8\A1\1E\E4\A1\1C\E6\01X\83y\98\87y(\879`\835\18\07|\88\03;`\835\98\87y(\076X\83y\98\87r\90\036X\83y\98\87r\98\03\80\A8\07w\98\87p0\87rh\03s\80\876h\87p\A0\07t\00\CC!\1C\D8a\1E\CA\01 \EAa\1E\CA\A1\0D\E6\E1\1D\CC\81\1E\DA\C0\1C\D8\E1\1D\C2\81\1E\00s\08\07v\98\87r\006\C8\88\F0\FF\FF\FF\FF\03\C1\0E\E50\0F\F3\D0\06\F0 \0F\E50\0E\E90\0F\E5\D0\06\E6\00\0F\ED\10\0E\E4\00\98C8\B0\C3<\94\03@\B8\C3;\B4\819\C8C8\B4C9\B4\01<\BCC:\B8\03=\94\83<\B4A9\B0C:\B4\03@\0F\F2P\0F\E5\00\0C\EE\F0\0Em`\0E\F2\10\0E\EDP\0Em\00\0F\EF\90\0E\EE@\0F\E5 \0FmP\0E\EC\90\0E\ED\D0\06\EE\F0\0E\EE\D0\06\ECP\0E\E1`\0E\00\E1\0E\EF\D0\06\E9\E0\0E\E60\0Fm`\0E\F0\D0\06\ED\10\0E\F4\80\0E\809\84\03;\CCC9\00\84;\BCC\1B\B8C8\B8\C3<\B4\819\C0C\1B\B4C8\D0\03:\00\E6\10\0E\EC0\0F\E5\00\10\F3@\0F\E10\0E\EB\D0\06\F0 \0F\EF@\0F\E50\0E\F4\F0\0E\F2\D0\06\E2P\0F\E6`\0E\E5 \0Fm0\0F\E9\A0\0F\E5\00\E0\01@\D0C8\C8\C39\94\03=\B4\C18\C0C=\00\E3\F0\0E\F2P\0Er\00\10\F4\10\0E\F2p\0E\E5@\0Fm`\0E\E5\10\0E\F4P\0F\F2P\0E\F3\00\AC\C1<\CC\C3<\94\C3\1C\B0\C1\1A\8C\03>\C4\81\1D\B0\C1\1A\CC\C3<\94\03\1B\AC\C1<\CCC9\C8\01\1B\AC\C1<\CCC9\CC\01@\D4\83;\CCC8\98C9\B4\819\C0C\1B\B4C8\D0\03:\00\E6\10\0E\EC0\0F\E5\00\10\F50\0F\E5\D0\06\F3\F0\0E\E6@\0Fm`\0E\EC\F0\0E\E1@\0F\809\84\03;\CCC9\00\00I\18\00\00\02\00\00\00\13\82`B \00\00\00\89 \00\00\0D\00\00\002\22\08\09 d\85\04\13\22\A4\84\04\13\22\E3\84\A1\90\14\12L\88\8C\0B\84\84L\100s\04H*\00\C5\1C\01\18\94`\88\08\AA0F7\10@3\02\00\134|\C0\03;\F8\05;\A0\836\08\07x\80\07v(\876h\87p\18\87w\98\07|\88\038p\838\80\037\80\83\0DeP\0Em\D0\0Ez\F0\0Em\90\0Ev@\07z`\07t\D0\06\E6\80\07p\A0\07q \07x\D0\06\EE\80\07z\10\07v\A0\07s \07z`\07t\D0\06\B3\10\07r\80\07:\0FDH #EB\80\1D\8C\10\18I\00\00@\00\00\C0\10\A7\00\00 \00\00\00\00\00\00\00\868\08\10\00\02\00\00\00\00\00\00\90\05\02\00\00\08\00\00\002\1E\98\0C\19\11L\90\8C\09&G\C6\04C\9A\22(\01\0AM\D0i\10\1D]\96\97C\00\00\00y\18\00\00\1C\00\00\00\1A\03L\90F\02\134A\18\08&PIC Level\13\84a\D80\04\C2\C05\08\82\83c+\03ab\B2j\02\B1+\93\9BK{s\03\B9q\81q\81\01A\19c\0Bs;k\B9\81\81q\81q\A9\99q\99I\D9\10\14\8D\D8\D8\EC\DA\5C\DA\DE\C8\EA\D8\CA\5C\CC\D8\C2\CE\E6\A6\04C\1566\BB6\974\B227\BA)A\01\00y\18\00\002\00\00\003\08\80\1C\C4\E1\1Cf\14\01=\88C8\84\C3\8CB\80\07yx\07s\98q\0C\E6\00\0F\ED\10\0E\F4\80\0E3\0CB\1E\C2\C1\1D\CE\A1\1Cf0\05=\88C8\84\83\1B\CC\03=\C8C=\8C\03=\CCx\8Ctp\07{\08\07yH\87pp\07zp\03vx\87p \87\19\CC\11\0E\EC\90\0E\E10\0Fn0\0F\E3\F0\0E\F0P\0E3\10\C4\1D\DE!\1C\D8!\1D\C2a\1Ef0\89;\BC\83;\D0C9\B4\03<\BC\83<\84\03;\CC\F0\14v`\07{h\077h\87rh\077\80\87p\90\87p`\07v(\07v\F8\05vx\87w\80\87_\08\87q\18\87r\98\87y\98\81,\EE\F0\0E\EE\E0\0E\F5\C0\0E\EC\00q \00\00\05\00\00\00&`<\11\D2L\85\05\10\0C\804\06@\F8\D2\14\01\00\00a \00\00\0B\00\00\00\13\04A,\10\00\00\00\03\00\00\004#\00dC\19\020\18\83\01\003\11\CA@\0C\83\11\C1\00\00#\06\04\00\1CB\12\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", section "__LLVM,__bitcode"
@llvm.cmdline = appending constant [67 x i8] c"-triple\00x86_64-apple-macosx10.10.0\00-emit-llvm\00-disable-llvm-optzns\00", section "__LLVM,__cmdline"

; Function Attrs: nounwind ssp uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  store i32 0, i32* %1
  %2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0))
  ret i32 0
}

declare i32 @printf(i8*, ...) #1

attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+ssse3,+cx16,+sse,+sse2,+sse3" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+ssse3,+cx16,+sse,+sse2,+sse3" "unsafe-fp-math"="false" "use-soft-float"="false" }

!llvm.module.flags = !{!0}
!llvm.ident = !{!1}

!0 = !{i32 1, !"PIC Level", i32 2}
!1 = !{!"Apple LLVM version 7.0.0 (clang-700.0.53.3)"}

อาร์เรย์ข้อมูลที่อยู่ใน IR ยังเปลี่ยนแปลงตามการปรับแต่งและการตั้งค่าการสร้างรหัสอื่น ๆ ของเสียงดังกราว มันไม่เป็นที่รู้จักสำหรับฉันอย่างสมบูรณ์รูปแบบหรืออะไรก็ตามที่อยู่ในนั้น

แก้ไข:

ทำตามคำแนะนำบน Twitter ฉันตัดสินใจที่จะทบทวนเรื่องนี้อีกครั้งและเพื่อยืนยัน ฉันติดตามโพสต์บล็อกนี้และใช้เครื่องมือแยกบิตโค้ดของเขาเพื่อรับไบนารี Apple Archive จากการปฏิบัติการของ MachO และหลังจากการแยก Apple Archive ด้วยยูทิลิตี้ xar ฉันได้รับสิ่งนี้ (แปลงเป็นข้อความด้วย llvm-dis แน่นอน)

; ModuleID = '1'
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"

@.str = private unnamed_addr constant [10 x i8] c"hi there!\00", align 1

; Function Attrs: nounwind ssp uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  store i32 0, i32* %1
  %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0))
  ret i32 0
}

declare i32 @printf(i8*, ...) #1

attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+ssse3,+cx16,+sse,+sse2,+sse3" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="core2" "target-features"="+ssse3,+cx16,+sse,+sse2,+sse3" "unsafe-fp-math"="false" "use-soft-float"="false" }

!llvm.module.flags = !{!0}
!llvm.ident = !{!1}

!0 = !{i32 1, !"PIC Level", i32 2}
!1 = !{!"Apple LLVM version 7.0.0 (clang-700.1.76)"}

ความแตกต่างที่โดดเด่นเพียงอย่างเดียวจริงๆระหว่าง non-bitcode IR และ bitcode IR คือชื่อไฟล์ถูกถอดเป็นเพียง 1, 2 และอื่น ๆ สำหรับแต่ละสถาปัตยกรรม

ฉันยังยืนยันว่าบิตโค้ดที่ฝังอยู่ในไบนารีถูกสร้างขึ้นหลังจากการปรับให้เหมาะสม ถ้าคุณคอมไพล์ด้วย -O3 และแตก bitcode มันจะแตกต่างจากถ้าคุณคอมไพล์ด้วย -O0

และเพื่อรับเครดิตเพิ่มเติมฉันยังยืนยันว่า Apple ไม่ได้จัดส่ง bitcode ไปยังอุปกรณ์เมื่อคุณดาวน์โหลดแอป iOS 9 มีส่วนที่แปลกประหลาดอื่น ๆ อีกจำนวนมากที่ฉันไม่รู้จักเช่น __LINKEDIT แต่ไม่รวมบันเดิล __LLVM .__ ดังนั้นจึงไม่ปรากฏว่ามีบิตโค้ดในไบนารีสุดท้ายที่ทำงานบนอุปกรณ์ อย่างผิดปกติพอ Apple ยังคงจัดส่งไบนารีไขมันด้วยรหัส 32/64 บิตที่แยกต่างหากไปยังอุปกรณ์ iOS 8


bitcode ของ Apple สามารถแยกส่วนได้หรือไม่? ตอนนี้ Apple สามารถดูซอร์สโค้ดของเราได้หรือไม่
malhal

@malcolmhall ถ้ามันคล้ายกับรหัส LLVM ถ้างั้นก็แค่เท่านั้น LLVM bytecode มีข้อมูลประเภทและคำแนะนำอื่น ๆ ที่สามารถแยกส่วนได้ง่ายขึ้นและมีประโยชน์มากขึ้น อย่างไรก็ตามฉันไม่รู้ว่ามีอะไรใน bitcode ของ Apple มันอาจจะมีประโยชน์มากกว่าอย่างน้อย แต่ก็ไม่เป็นที่รู้จักในจุดนี้ว่ามีประโยชน์อย่างไร ทั้งสองวิธีผมขอสงสัยมันจะเป็นที่แข็งแกร่งของข้อมูลที่เป็นบอกว่า .NET IL ช่วยให้ decompilation เกือบจะสมบูรณ์แบบไปที่ C # รหัส
Earlz

คุณเคยเห็นรูปแบบไฟล์บิตโค้ดของ LLVMหรือไม่ หมายเลขเวทย์มนตร์นั้นแตกต่างออกไป แต่ Apple บอกเป็นนัยว่านี่เป็นรูปแบบบิตโค้ด
Jeffery Thomas

"ซึ่งจัดส่งพร้อมกับทุกสถาปัตยกรรมที่รองรับ (กล่าวคือทำซ้ำ)" มันไม่ได้ทำซ้ำเนื่องจากบิตโค้ดแตกต่างกันสำหรับแต่ละส่วนของ mach-o
AlexDenisov

2
ตามtwitter.com/mistydemeo/status/644555663373307904 , xar!เป็นรูปแบบไฟล์ที่เก็บแอปเปิ้ล
Riking

14

Bitcode (iOS, watchOS)

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


โดยทั่วไปแนวคิดนี้จะค่อนข้างคล้ายกับจาวาที่โค้ดไบต์ทำงานบน JVM ที่แตกต่างกันและในกรณีนี้บิตโค้ดจะถูกวางไว้ใน iTune store และแทนที่จะให้รหัสกลางกับแพลตฟอร์มที่แตกต่างกัน (อุปกรณ์) มันให้รหัสที่คอมไพล์ซึ่งไม่ต้องการ เครื่องเสมือนใด ๆ ที่จะเรียกใช้

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

ผู้พัฒนาไม่จำเป็นต้องทำการเปลี่ยนแปลงและส่งแอพอีกครั้งเพื่อรองรับแพลตฟอร์มใหม่

ลองมาตัวอย่างของ iPhone 5s เมื่อ Apple เปิดตัวx64ชิปในนั้น แม้ว่าx86แอพจะใช้งานร่วมกับx64สถาปัตยกรรมได้ทั้งหมดแต่เพื่อใช้ประโยชน์จากx64แพลตฟอร์มอย่างเต็มที่นักพัฒนาจะต้องเปลี่ยนสถาปัตยกรรมหรือรหัสบางส่วน เมื่อเสร็จแล้วแอพจะถูกส่งไปยัง app store เพื่อตรวจสอบ

หากแนวคิดบิตโค้ดนี้เปิดตัวก่อนหน้านี้เราผู้พัฒนาไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ เพื่อสนับสนุนx64สถาปัตยกรรมบิต


@ user102008 การแบ่งส่วนเป็นผลมาจากการเปิดใช้งาน Bitcode
keji

@kdogisthebest: ไม่มันไม่ใช่ ไม่มีที่ไหนพูดได้ และฉันได้ดูวิดีโอ WWDC เกี่ยวกับการแบ่งส่วนและไม่ได้กล่าวถึงการเปิดใช้งาน Bitcode ทุกครั้ง
user102008

Inder Kumar Rathore เมื่อมาถึง Enterprise App Store มันจัดการได้อย่างไร? องค์กร app store สนับสนุนคุณสมบัตินี้หรือไม่
damithH

@damH ไม่มีแอพองค์กรสำหรับองค์กรเราต้องเก็บแอพไว้ในเซิร์ฟเวอร์ของเรา ฉันไม่แน่ใจว่าแอปที่ผอมบางจะทำงานกับแอพขององค์กรหรือไม่ แต่เท่าที่ความรู้ของฉันมันไม่ควรจะมีสำหรับแอพขององค์กร
Inder Kumar Rathore

โปรดอัปเดตภาพในคำตอบของคุณซึ่งไม่เกี่ยวข้องกับ Bitcode
hsafarya

5

ปรับปรุง

Apple ได้ชี้แจงว่าการแบ่งส่วนเกิดขึ้นโดยไม่ขึ้นกับการเปิดใช้งานบิตโค้ด ฉันได้สังเกตสิ่งนี้ในทางปฏิบัติแล้วว่าจะดาวน์โหลดแอพที่ไม่ได้เปิดใช้งานบิทโค้ดเป็นสถาปัตยกรรมที่เหมาะสมสำหรับอุปกรณ์เป้าหมายเท่านั้น

เป็นต้นฉบับ

โดยเฉพาะอย่างยิ่ง :

Bitcode เก็บถาวรแอปของคุณเพื่อส่งไปยัง App Store ในรูปแบบสื่อกลางซึ่งรวบรวมเป็นไฟล์ปฏิบัติการ 64- ​​บิตหรือ 32- บิตสำหรับอุปกรณ์เป้าหมายเมื่อส่งมอบ

หั่น อาร์ตเวิร์ครวมอยู่ในแคตตาล็อกสินทรัพย์และติดแท็กสำหรับแพลตฟอร์มที่ช่วยให้ App Store ส่งมอบเฉพาะสิ่งที่จำเป็นสำหรับการติดตั้ง

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


ในคู่มือการทำให้ผอมบางแอพ ( developer.apple.com/library/prerelease/ios/documentation/IDEs/ ...... ) "การแบ่งเป็นกระบวนการของการสร้างและส่งชุดตัวเลือกแอปสำหรับอุปกรณ์เป้าหมายที่แตกต่างกันตัวแปรนั้นมีเพียงสถาปัตยกรรมที่ปฏิบัติการได้ และทรัพยากรที่จำเป็นสำหรับอุปกรณ์เป้าหมาย " ผู้ดาวน์โหลดแอปของคุณรับเฉพาะสถาปัตยกรรมของพวกเขาเป็นส่วนหนึ่งของการแบ่งส่วน
user102008
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.