Xcode 5 và iOS 7: Kiến trúc và kiến ​​trúc hợp lệ


82

Tôi đang bắt đầu dự án mới trong Xcode 5. Tôi muốn phát triển ứng dụng bằng cách sử dụng iOS SDK 7nhưng với mục tiêu triển khai iOS 5.0. Ngay khi tôi tạo dự án mới trong Xcode và cố gắng thay đổi mục tiêu triển khai thành 5.0, tôi đã nhận được thông báo sau:

Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.

Vì vậy, đã thay đổi kiến ​​trúc thành Standard(không có 64bit). Tôi biên dịch, chạy nhưng tôi không thực sự hiểu chuyện gì vừa xảy ra.

Sự khác biệt giữa ArchitecturesValid architecturescài đặt trong Cài đặt xây dựng dự án Xcode là gì?
Nếu tôi đặt Architecturesloại trừ 64-bit, điều gì sẽ xảy ra khi tôi chạy ứng dụng của mình trên iPhone hoặc Trình mô phỏng iOS 64-bit (tôi biết nó hoạt động, tôi chỉ tò mò không biết có gì bên dưới)?
Bạn có thể giải thích sự lộn xộn lớn với kiến ​​trúc 64-bit mới không?

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


Bạn đã xem trên Diễn đàn nhà phát triển của Apple chưa? Có rất nhiều bài viết về điều này. devforums.apple.com/message/887506#887506
trojanfoe

Câu trả lời:


123

Đặt kiến ​​trúc trong cài đặt xây dựng thành Kiến trúc chuẩn (armv7, armv7s)

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

iPhone 5S được trang bị vi xử lý A7 64bit. Từ tài liệu apple

Xcode có thể xây dựng ứng dụng của bạn với cả hai tệp nhị phân 32-bit và 64-bit. Hệ nhị phân kết hợp này yêu cầu mục tiêu triển khai tối thiểu là iOS 7 trở lên.

Lưu ý: Phiên bản tương lai của Xcode sẽ cho phép bạn tạo một ứng dụng duy nhất hỗ trợ thời gian chạy 32 bit trên iOS 6 trở lên và hỗ trợ thời gian chạy 64 bit trên iOS 7.

Từ tài liệu tôi hiểu là gì

  • Xcode có thể tạo cả hai tệp nhị phân 64 bit 32 bit cho một ứng dụng nhưng mục tiêu triển khai phải là iOS7. Họ đang nói trong tương lai nó sẽ là iOS 6.0
  • Hệ nhị phân 32 bit sẽ hoạt động tốt trong iPhone 5S (bộ xử lý 64 bit).

Cập nhật (Xcode 5.0.1)
Trong Xcode 5.0.1, họ đã thêm hỗ trợ tạo nhị phân 64 bit cho iOS 5.1.1 trở đi.

Xcode 5.0.1 có thể xây dựng ứng dụng của bạn với cả mã nhị phân 32 bit và 64 bit. Hệ nhị phân kết hợp này yêu cầu mục tiêu triển khai tối thiểu là iOS 5.1.1 trở lên. Hệ nhị phân 64-bit chỉ chạy trên các thiết bị 64-bit chạy iOS 7.0.3 trở lên.

Bản cập nhật (Xcode 5.1)
Xcode 5.1 đã thực hiện thay đổi đáng kể trong phần kiến ​​trúc. Đây câu trả lời sẽ là một followup cho bạn. Kiểm tra điều này


Như tôi đã viết trong câu hỏi của mình, tôi đã làm được. Câu hỏi của tôi là nhiều hơn về những gì nó thay đổi và những gì xảy ra bên dưới.
Crazy Yoghurt,

về chỉnh sửa: Vì vậy, nó chỉ là về các tệp nhị phân được bao gồm? Với Kiến trúc được đặt để loại trừ 64-bit, iPhone 5S sẽ chạy 32-bit nhị phân?
Crazy Yoghurt,

về chỉnh sửa: Tôi nghĩ mục tiêu triển khai tối thiểu phải là iOS 6.0, không phải iOS 7.0. @CrazyYoghurt Có, như với Mac - máy 64-bit có thể chạy mã nhị phân 32-bit, nếu không máy 64-bit sẽ không có gì để chạy khi được giới thiệu lần đầu.
trojanfoe

hiện làm việc ứng dụng trên 5s và các thiết bị khác với mục tiêu triển khai iOS7 nên iOS 7.0
Anil Varghese

3
@CrazyYoghurt Sau đó, bạn phải thả arm64.
trojanfoe

9

Sự hiểu biết của tôi từ Apple Docs.

  • Là gì Kiến trúc (Vòm) vào Xcode build-settings?
    • Chỉ định / s kiến ​​trúc mà nhị phân được NHẮM MỤC TIÊU . Khi được chỉ định nhiều hơn một kiến ​​trúc đó, tệp nhị phân được tạo có thể chứa mã đối tượng cho mỗi kiến ​​trúc được chỉ định.
  • Là gì Kiến trúc hợp lệ (VALID_ARCHS) vào Xcode build-settings?

    • Chỉ định / s kiến ​​trúc mà nhị phân có thể là BUILT .
    • Trong quá trình xây dựng, danh sách này được giao với ARCHS và danh sách kết quả chỉ định các kiến ​​trúc mà hệ nhị phân có thể chạy.
  • Ví dụ: - Một dự án iOS có cài đặt xây dựng sau vào Xcode.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • Trong trường hợp này, hệ nhị phân sẽ được xây dựng cho các kiến ​​trúc armv7 armv7s arm64. Nhưng cùng một tệp nhị phân sẽ chỉ chạy trên CHỈ ARCHS = armv7 armv7s.

9
Không, vẫn còn lẫn lộn địa ngục ra khỏi tôi: S
Ade

"danh sách kết quả" là gì ??
DanMoore

@DanMoore Kết quả của giao điểm đã đặt .
Slipp D. Thompson

2
Sẽ rất hợp lý nếu tôi có thể tìm ra lý do tại sao tôi muốn xây dựng một kiến ​​trúc mà tôi không muốn chạy trên đó.
rob5408

6

Khi bạn đặt 64-bit, tệp nhị phân thu được là tệp nhị phân "Fat", chứa tất cả ba hình ảnh Mach-O đi kèm với một tiêu đề chất béo mỏng. Bạn có thể thấy rằng sử dụng otool hoặc jtool. Bạn có thể xem một số mã nhị phân béo được bao gồm như một phần của iOS 7.0 SDK, ví dụ như AVFoundation Framework, như sau:

% cd  /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/

%otool -V -f AVFoundation                                                                     9:36
Fat headers
fat_magic FAT_MAGIC
nfat_arch 3
architecture arm64     # The 64-bit version (A7)
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 16384
    size 2329888
    align 2^14 (16384)
architecture armv7        # A5X - packaged after the arm64version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 2359296
    size 2046336
    align 2^14 (16384)
architecture armv7s       # A6 - packaged after the armv7 version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7S
    capabilities 0x0
    offset 4407296
    size 2046176
    align 2^14 (16384)

Đối với bản thân hệ nhị phân, nó sử dụng tập lệnh ARM64 bit, (hầu hết tương thích với 32 bit, nhưng) một tập lệnh hoàn toàn khác. Điều này đặc biệt quan trọng đối với chương trình đồ họa (sử dụng các lệnh và thanh ghi NEON). Tương tự như vậy, CPU có nhiều thanh ghi hơn, điều này ảnh hưởng khá nhiều đến tốc độ chương trình. Có một cuộc thảo luận thú vị trong http://blogs.barrons.com/techtraderdaily/2013/09/19/apple-the-64-bit-question/?mod=yahoobarrons về việc điều này có tạo ra sự khác biệt hay không; các bài kiểm tra điểm chuẩn cho đến nay đã chỉ ra rõ ràng rằng nó có.

Sử dụng otool -tV sẽ kết xuất lắp ráp (nếu bạn có XCode 5 trở lên), và sau đó bạn có thể thấy sự khác biệt về tập lệnh cho chính mình. Hầu hết (nhưng không phải tất cả) các nhà phát triển sẽ vẫn không tin vào các thay đổi, vì phần lớn chúng không ảnh hưởng trực tiếp đến obj-C (mặc dù CG * API) và phải làm nhiều việc hơn với việc xử lý con trỏ cấp thấp. Trình biên dịch sẽ hoạt động kỳ diệu và tối ưu hóa của nó.


6

Bạn không cần giới hạn trình biên dịch của mình ở chỉ armv7armv7s bằng cách xóa cài đặt arm64 khỏi các kiến ​​trúc được hỗ trợ. Bạn chỉ cần đặt Cài đặt mục tiêu triển khai thành 5.1.1

Lưu ý quan trọng: bạn không thể đặt mục tiêu Triển khai thành 5.1.1 trong phần Cài đặt bản dựng vì nó chỉ được thả xuống với các giá trị cố định. Nhưng bạn có thể dễ dàng đặt nó thành 5.1.1 trong phần Chung của cài đặt ứng dụng bằng cách chỉ cần nhập giá trị vào trường văn bản.


5

Sửa chữa đơn giản:

Mục tiêu -> Cài đặt bản dựng -> Tùy chọn bản dựng -> Bật Bitcode -> Không

Hoạt động trên thiết bị chạy iOS 9.3.3


4

Không có câu trả lời nào hoạt động và sau đó tôi đã quên đặt mục tiêu triển khai tối thiểu có thể được tìm thấy trong Dự án -> Chung -> Thông tin triển khai -> Mục tiêu triển khai -> 8.0

Thí dụ

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.