Tác động của các tùy chọn xây dựng Xcode Giúp kích hoạt mã bit bit Có / Không


238

Hôm qua tôi đã nhận ra một tấn cảnh báo liên quan đến thư viện parse.com:

URGENT: tất cả bitcode sẽ bị loại bỏ vì '[path] /Pude.framework/Pude (PFAnalytics.o)' được xây dựng mà không có bitcode. Bạn phải xây dựng lại nó với kích hoạt mã bit (cài đặt Xcode ENABLE_BITCODE), lấy thư viện cập nhật từ nhà cung cấp hoặc tắt mã bitcoin cho mục tiêu này. Lưu ý: Đây sẽ là một lỗi trong tương lai.

Tôi nhận thức được thực tế rằng tôi có thể xóa những cảnh báo đó bằng câu trả lời này nhưng hiện tôi đang tự hỏi liệu nó có ảnh hưởng tiêu cực nào đến việc gửi AppStore và / hoặc hiệu suất thực tế của ứng dụng của tôi không.

Xcode thông báo cho bạn về bitcode

Kích hoạt cài đặt này cho biết rằng mục tiêu hoặc dự án sẽ tạo ra bitcode trong quá trình biên dịch cho các nền tảng và kiến ​​trúc hỗ trợ nó. Đối với các bản dựng Lưu trữ, bitcode sẽ được tạo trong tệp nhị phân được liên kết để gửi đến cửa hàng ứng dụng. Đối với các bản dựng khác, trình biên dịch và trình liên kết sẽ kiểm tra xem mã có tuân thủ các yêu cầu để tạo bitcode hay không, nhưng sẽ không tạo ra bitcode thực tế. [ENABLE_BITCODE]

Nhưng tôi không nhận được bất kỳ thông tin thực sự hữu ích từ văn bản này.

  • Tôi có thể sử dụng câu trả lời được liên kết để tránh sự cố mà không có bất kỳ tác động tiêu cực nào và không ảnh hưởng đến việc gửi AppStore trong tương lai không?
  • Những gì ENABLE_BITCODEthực sự làm, nó sẽ là một yêu cầu không tùy chọn trong tương lai?
  • Có bất kỳ tác động hiệu suất nếu tôi kích hoạt / vô hiệu hóa nó?

Câu trả lời:


398
  • ENABLE_BITCODE thực sự làm gì, nó sẽ là một yêu cầu không bắt buộc trong tương lai?

Tôi không chắc bạn đang tìm kiếm câu trả lời ở cấp độ nào, vì vậy hãy đi một chuyến nhỏ. Một số điều này bạn có thể đã biết.

Khi bạn xây dựng dự án của mình, Xcode gọi clangcác mục tiêu Objective-C và swift/ swiftccho các mục tiêu Swift. Cả hai trình biên dịch này biên dịch ứng dụng thành biểu diễn trung gian (IR), một trong những IR này là bitcode. Từ IR này, một chương trình có tên LLVM tiếp quản và tạo các nhị phân cần thiết cho chế độ x86 32 và 64 bit (cho trình giả lập) và arm6 / arm7 / arm7s / arm64 (cho thiết bị). Thông thường, tất cả các nhị phân khác nhau này được gộp lại trong một tệp duy nhất gọi là nhị phân chất béo .

Tùy chọn ENABLE_BITCODE cắt bỏ bước cuối cùng này. Nó tạo ra một phiên bản của ứng dụng với mã nhị phân IR bit. Điều này có một số tính năng hay, nhưng một nhược điểm lớn: nó không thể chạy ở bất cứ đâu. Để có được một ứng dụng có nhị phân bitcode chạy, mã bit cần phải được biên dịch lại ( có thể được lắp ráp hoặc chuyển mã. Tôi không chắc chắn về động từ chính xác ) thành nhị phân x86 hoặc ARM.

Khi một ứng dụng bitcode được gửi tới App Store, Apple sẽ thực hiện bước cuối cùng này và tạo các tệp nhị phân đã hoàn thành.

Ngay bây giờ, các ứng dụng bitcode là tùy chọn, nhưng lịch sử đã cho thấy Apple biến những thứ tùy chọn thành yêu cầu (như hỗ trợ 64 bit). Việc này thường mất vài năm, vì vậy các nhà phát triển bên thứ ba (như Parse) có thời gian để cập nhật.

  • Tôi có thể sử dụng phương pháp trên mà không có bất kỳ tác động tiêu cực nào và không ảnh hưởng đến việc gửi ứng dụng trong tương lai không?

Có, bạn có thể tắt ENABLE_BITCODE và mọi thứ sẽ hoạt động như trước. Cho đến khi Apple biến ứng dụng bitcode thành một yêu cầu cho App Store, bạn sẽ ổn.

  • Có bất kỳ tác động hiệu suất nếu tôi kích hoạt / vô hiệu hóa nó?

Sẽ không bao giờ có tác động tiêu cực đến việc kích hoạt nó, nhưng phân phối nội bộ của một ứng dụng để thử nghiệm có thể trở nên phức tạp hơn.

Đối với các tác động tích cực, điều đó thật phức tạp.

Để phân phối trong App Store, Apple sẽ tạo các phiên bản ứng dụng riêng biệt cho từng kiến ​​trúc máy (arm6 / arm7 / arm7s / arm64) thay vì một ứng dụng có nhị phân béo. Điều này có nghĩa là ứng dụng được cài đặt trên thiết bị iOS sẽ nhỏ hơn.

Ngoài ra, khi bitcode được biên dịch lại ( có thể được lắp ráp hoặc chuyển mã lại một lần nữa, tôi không chắc động từ chính xác ), nó được tối ưu hóa. LLVM luôn làm việc để tạo ra một tối ưu hóa mới tốt hơn. Về lý thuyết, App Store có thể tạo lại phiên bản riêng của ứng dụng trong App Store với mỗi bản phát hành LLVM mới, vì vậy ứng dụng của bạn có thể được tối ưu hóa lại bằng công nghệ LLVM mới nhất.


19
"Apple sẽ tạo các phiên bản ứng dụng riêng biệt cho từng kiến ​​trúc máy (arm6 / arm7 / arm7s / arm64) thay vì một ứng dụng có nhị phân béo. Điều này có nghĩa là ứng dụng được cài đặt trên thiết bị iOS sẽ nhỏ hơn." Đó là những gì Cắt lát làm. Điều này không liên quan đến Bitcode.
user102008 6/07/2015

10
"Tùy chọn ENABLE_BITCODE cắt bỏ bước cuối cùng này." Nó không cắt bỏ bất kỳ bước nào. Tất cả các nhị phân kiến ​​trúc vẫn được sản xuất. Thông tin mã bit PLUS sau đó được thêm vào cho kiến ​​trúc MACHI. Xem stackoverflow.com/a/31030741/102008
user102008 6/07/2015

6
Xem developer.apple.com/library/prerelease/watchos/documentation/... "Cắt lát là quá trình tạo ra và cung cấp các biến thể của gói ứng dụng cho các thiết bị mục tiêu khác nhau. Một biến thể chỉ chứa các kiến trúc thực thi và các nguồn lực cần thiết cho mục tiêu thiết bị. "
user102008 7/07/2015

7
Đó không phải là một tuyên bố đúng rằng việc kích hoạt Bitcode sẽ làm cho ứng dụng được cài đặt trên thiết bị nhỏ hơn so với khi Bitcode bị vô hiệu hóa. Không nơi nào nó nói rằng.
user102008

7
@ onmyway133 Không phải tất cả các nhà cung cấp đều cung cấp nguồn. Nếu tất cả các nhà cung cấp cung cấp là một tệp lib và tiêu đề tĩnh (hoặc Khung), thì nhà cung cấp cần phải biên dịch nội dung của họ với mã bit được kích hoạt.
Jeffery Thomas


35

Bitcode là một tính năng mới của iOS 9

Bitcode là một đại diện trung gian của một chương trình được biên dịch. Các ứng dụng bạn tải lên iTunes Connect có chứa bitcode sẽ được biên dịch và liên kết trên App Store. Bao gồm bitcode sẽ cho phép Apple tối ưu hóa lại nhị phân ứng dụng của bạn trong tương lai mà không cần phải gửi phiên bản mới của ứng dụng cho cửa hàng.

Lưu ý: Đối với các ứng dụng iOS, bitcode là mặc định, nhưng tùy chọn. Nếu bạn cung cấp bitcode, tất cả các ứng dụng và khung trong gói ứng dụng cần bao gồm bitcode. Đối với các ứng dụng watchOS, bitcode là bắt buộc

Vì vậy, bạn nên tắt bitcode cho đến khi tất cả các khung của ứng dụng của bạn đã kích hoạt bitcode.


'Tối ưu hóa lại nhị phân ứng dụng của bạn trong tương lai' - bạn có thể giải thích thêm một chút không?
genaks

Ở đây có ghi rằng: "Bitcode là một tính năng mới của iOS 9" và rằng "[...] Đối với các ứng dụng watchOS, bitcode là bắt buộc [...]". Vậy, nếu tôi muốn tạo một ứng dụng WatchOS trong iOS 8 thì sao?
superpuccio

33

Bitcode làm cho báo cáo sự cố khó khăn hơn . Dưới đây là trích dẫn từ HockeyApp (cũng đúng với mọi giải pháp báo cáo sự cố khác ):

Khi tải ứng dụng lên App Store và để hộp kiểm "Bitcode" được bật, Apple sẽ sử dụng bản dựng Bitcode đó và biên dịch lại trên đầu của chúng trước khi phân phối nó cho các thiết bị. Điều này sẽ dẫn đến việc nhị phân nhận được một UUID mới và có một tùy chọn để tải xuống một dSYM tương ứng thông qua Xcode.

Lưu ý: câu trả lời đã được chỉnh sửa vào tháng 1 năm 2016 để phản ánh hầu hết các thay đổi gần đây


2
Trong khoảng thời gian từ tháng 9 đến tháng 12, điều này được quản lý để khắc phục thông qua tùy chọn xuất Xcode Organizer mới (xem bản cập nhật trong trích dẫn HA) và bị hỏng lần nữa (xem câu hỏi HA đã giải quyết của tôi )
Pavel Zdenek

13

@ vj9 thx. Tôi cập nhật lên xcode 7. Nó cho tôi thấy lỗi tương tự. Xây dựng tốt sau khi đặt "KHÔNG"

nhập mô tả hình ảnh ở đây

đặt "KHÔNG" nó hoạt động tốt.

nhập mô tả hình ảnh ở đây


1
@Septronic Nếu bạn muốn chọn CÓ. Bạn cần kiểm tra tất cả các khung thứ ba của bạn hỗ trợ này.
zszen

Mục tiêu phiên bản iOS được hỗ trợ tối thiểu của bạn phải là iOS 6 trở lên.
nông. Suy nghĩ

9

Tại đây bạn có thể tìm thấy tất cả các giải pháp liên quan đến Bitcode

Theo Apple Doc

Bitcode là một đại diện trung gian của một chương trình được biên dịch. Các ứng dụng bạn tải lên iTunes Connect có chứa bitcode sẽ được biên dịch và liên kết trên cửa hàng. Bao gồm bitcode sẽ cho phép Apple tối ưu hóa lại nhị phân ứng dụng của bạn trong tương lai mà không cần phải gửi phiên bản mới của ứng dụng cho cửa hàng.

Xcode ẩn các biểu tượng được tạo trong thời gian xây dựng theo mặc định, do đó chúng không thể đọc được bởi Apple. Chỉ khi bạn chọn bao gồm các biểu tượng khi tải ứng dụng của mình lên iTunes Connect, các biểu tượng sẽ được gửi đến Apple. Bạn phải bao gồm các biểu tượng để nhận báo cáo sự cố từ Apple.

Lưu ý: Đối với các ứng dụng iOS, bitcode là mặc định, nhưng tùy chọn. Đối với các ứng dụng watchOS và tvOS, bitcode là bắt buộc. Nếu bạn cung cấp bitcode, tất cả các ứng dụng và khung trong gói ứng dụng (tất cả các mục tiêu trong dự án) cần phải bao gồm bitcode. Sau khi bạn phân phối ứng dụng của mình bằng iTunes Connect, bạn có thể tải xuống tệp dSYM cho bản dựng, được mô tả trong Xem và nhập sự cố trong Cửa sổ thiết bị

Việc triển khai ban đầu của Apple về dịch vụ làm mỏng bitcode và ứng dụng đã bị trì hoãn, vì các vấn đề trong việc nâng cấp từ một loại phần cứng lên một loại phần cứng khác đã không khôi phục đúng phiên bản nhị phân. Sự cố này sau đó đã được khắc phục với iOS 9.0.2 và tính năng được bật lại.

Bitcode luôn là một phần của các giai đoạn biên dịch và tối ưu hóa LLVM, nhưng bằng cách di chuyển logic back-end đến các máy chủ của Apple, nó chuyển các giai đoạn tối ưu hóa và lắp ráp từ thời gian biên dịch của nhà phát triển sang triển khai App Store. Điều này mở ra tiềm năng tối ưu hóa lại hoặc dịch lại trong tương lai để hỗ trợ các bộ xử lý mới hơn và nhanh hơn trong tương lai. Việc triển khai bitcode là bắt buộc đối với các thành phần của watchOS và tvOS và có thể được kích hoạt theo điều kiện cho các triển khai iOS hiện có với tùy chọn "Bật Bitcode" trong cài đặt dự án. Điều này sẽ thêm một dấu hiệu nhúng mã bitcoin cho các bản dựng gỡ lỗi và mã bitcoin nhúng cho các bản dựng lưu trữ / thiết bị. Chúng có thể được chuyển đến trình biên dịch Swift với -embed-bitcode hoặc bằng cách sử dụng clang với -fembed-bitcode.

Bitcode cũng có một số nhược điểm.Các nhà phát triển có thể gỡ lỗi báo cáo sự cố từ các ứng dụng bằng cách lưu trữ các bản sao của các biểu tượng gỡ lỗi tương ứng với tệp nhị phân đã được chuyển đến Apple. Khi sự cố xảy ra trong một ngăn xếp nhất định, nhà phát triển có thể khôi phục theo dõi ngăn xếp ban đầu bằng cách tượng trưng cho báo cáo sự cố, sử dụng các ký hiệu gỡ lỗi này. Tuy nhiên, các ký hiệu là sản phẩm phụ của việc dịch dạng trung gian sang dạng nhị phân; nhưng nếu bước đó được thực hiện trên máy chủ, thông tin này sẽ bị mất. Apple cung cấp dịch vụ báo cáo sự cố có thể đóng vai trò của trình gỡ lỗi, miễn là nhà phát triển đã tải lên các biểu tượng gỡ lỗi tại thời điểm xuất bản ứng dụng. Việc nhà phát triển không bao giờ nhìn thấy nhị phân chính xác có nghĩa là họ có thể không kiểm tra được các vấn đề cụ thể khi phần cứng mới phát triển.

Cuối cùng, mã bit trên máy chủ có thể được dịch để hỗ trợ các kiến ​​trúc và tập lệnh mới khi chúng phát triển. Với điều kiện họ duy trì quy ước gọi và kích thước của căn chỉnh và các từ, một ứng dụng mã bit có thể được dịch sang các loại kiến ​​trúc khác nhau và được tối ưu hóa cụ thể cho bộ xử lý mới. Nếu các thư viện chuẩn cho các thói quen toán học và vectơ được sử dụng, chúng có thể được tối ưu hóa thành các hướng dẫn vectơ cụ thể của bộ xử lý để đạt được hiệu suất tốt nhất cho một ứng dụng nhất định. Các trình tối ưu hóa thậm chí có thể tạo ra nhiều mã hóa khác nhau và phán đoán dựa trên kích thước hoặc tốc độ thực hiện.

Để biết thêm thông tin xin vui lòng kiểm tra ở đây và ở đây


6

Từ các tài liệu

  • Tôi có thể sử dụng phương pháp trên mà không có bất kỳ tác động tiêu cực nào và không ảnh hưởng đến việc gửi ứng dụng trong tương lai không?

Bitcode sẽ cho phép apple tối ưu hóa ứng dụng mà không cần bạn phải gửi bản dựng khác. Nhưng, bạn chỉ có thể kích hoạt tính năng này nếu tất cả các khung và ứng dụng trong gói ứng dụng đã bật tính năng này. Có nó giúp, nhưng không có nó nên không có tác động tiêu cực.

  • ENABLE_BITCODE thực sự làm gì, nó sẽ là một yêu cầu không bắt buộc trong tương lai?

Đối với các ứng dụng iOS, bitcode là mặc định, nhưng tùy chọn. Nếu bạn cung cấp bitcode, tất cả các ứng dụng và khung trong gói ứng dụng cần bao gồm bitcode. Đối với các ứng dụng watchOS, bitcode là bắt buộc.

  • Có bất kỳ tác động hiệu suất nếu tôi kích hoạt / vô hiệu hóa nó?

App Store và hệ điều hành tối ưu hóa việc cài đặt ứng dụng iOS và watchOS bằng cách điều chỉnh phân phối ứng dụng theo khả năng của thiết bị cụ thể của người dùng, với dấu chân tối thiểu. Tối ưu hóa này, được gọi là làm mỏng ứng dụng, cho phép bạn tạo các ứng dụng sử dụng nhiều tính năng nhất của thiết bị, chiếm dung lượng đĩa tối thiểu và phù hợp với các bản cập nhật trong tương lai có thể được Apple áp dụng. Tải xuống nhanh hơn và nhiều không gian hơn cho các ứng dụng và nội dung khác cung cấp trải nghiệm người dùng tốt hơn.

Không nên có bất kỳ tác động hiệu suất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.