Cách xây dựng kiến ​​trúc armv6 và armv7 với iOS 5


96

Trong iOS5, Apple loại bỏ kiến trúc armv6 khỏi ARCHS_STANDARD_32_BIT .

Để duy trì hỗ trợ cho iPhone3G, tôi vẫn muốn biên dịch trong armv6 ngay cả trong iOS5.

Có ai tìm thấy một giải pháp cho điều này?

Câu trả lời:


96

Hôm nay tôi vừa xây dựng một cái gì đó xác định mục tiêu triển khai của iOS 4.0. Chỉ với armv7 được chỉ định trong Architectures, Xcode đã cảnh báo tôi rằng để hỗ trợ bất kỳ thứ gì bên dưới iOS4.2, tôi phải đưa armv6 vào Architectures. Chỉ cần chỉnh sửa trường đó, nhấp vào nút "+" khi hộp thoại bật lên và nhập "armv6" theo nghĩa đen.

Trong trường hợp của tôi, chúng tôi muốn ứng dụng của mình hoạt động trên iOS4 và iOS5. Chúng tôi đã phải thực hiện một số sửa đổi để nó hoạt động chính xác trong iOS5, nhưng tất cả những thay đổi đó đều được thực hiện với các thay đổi mã thân thiện với iOS4.

Chúng tôi cũng đã thêm một số tính năng dành riêng cho iOS5 theo cách cho phép ứng dụng chạy mà không gặp sự cố trong iOS4. Cụ thể, chúng tôi đã kiểm tra các khả năng của iOS5 trước khi cố gắng sử dụng chúng và liên kết các thư viện chỉ dành cho iOS5 là Tùy chọn.

Vì vậy, việc hỗ trợ iPhone3G trong thế giới iOS5 có thể dễ dàng có nghĩa là "chúng tôi muốn ứng dụng của mình chạy trên iOS4 trở lên (bất kể sử dụng tính năng iOS5 nào)" chứ không phải "chúng tôi muốn đảm bảo ứng dụng của mình chạy trên thiết bị cũ hơn chạy iOS5 ". Có một sự khác biệt ở đây; nghĩ về nó. :-)

Dù sao, việc thêm hỗ trợ armv6 trở lại là rất dễ dàng. Và tôi đoán vấn đề ở đây là: Tại một thời điểm nào đó, khi không còn thiết bị armv6 nào ngoài kia để lo lắng (vì bất cứ lý do gì), bạn sẽ không phải xây dựng cho nó. Quan điểm của Apple là mọi người nên nâng cấp lên phần cứng mới nhất càng sớm càng tốt. Vì vậy, trong thế giới đó, không cần phải có các công cụ mặc định cho bất cứ thứ gì ngoài những thứ mới nhất và lớn nhất. :-) May mắn thay (hoặc không), các nhà phát triển của chúng tôi sống trong thế giới thực và nhận ra rằng bạn phải hỗ trợ những thứ cũ hơn một thời gian. Và tôi đoán nhóm nhà phát triển Xcode cũng biết điều này, đó là lý do tại sao bạn có thể thêm hỗ trợ armv6 trở lại khá đơn giản.


3
Cảm ơn câu trả lời chính xác của bạn :-) Thật vậy, tôi muốn có thể chạy ứng dụng của mình trên iPhone 3G với iOS 4.2.1 trở xuống (giới hạn ở 4.0) và có một số tính năng cụ thể của iOS 5 cho các thiết bị hiện tại. Tôi đã không thử chỉ cần thêm "armv6" trong kiến ​​trúc, tôi đang tìm kiếm một biến môi trường như ARCHS_STANDARD_32_BIT và tôi vừa tìm thấy ARCHS_UNIVERSAL_IPHONE_OS nhưng nó dường như không hoạt động.
iGranDav

3
Tôi muốn thêm rằng có rất nhiều giải pháp đề xuất rằng nó nên nói "armv6 armv7" - điều này không hiệu quả với tôi. Hiện nay chỉ có "ARMv6 $ (ARCHS_STANDARD_32_BIT)" công trình đối với tôi, có nghĩa là không thoát khỏi những gì ở đó, chỉ cần thêm "ARMv6" vào Kiến trúc thiết
Brack

1
Tôi đã làm tất cả những điều này và bản dựng của tôi vẫn không thành công - lý do là tôi đã đặt bản dựng Phát hành (chưa sử dụng) thành Mục tiêu triển khai của iOS 5.0 trong khi Gỡ lỗi và Phân phối được đặt thành 3.0 và điều này dường như ngừng xây dựng xcode cho armv6. Đặt mục tiêu Triển khai thành 3.0 cho tất cả các bản dựng đã khắc phục sự cố.
Simon East

6
Nó không hoạt động với tôi (ngay cả sau khi thêm 'armv6'). Ứng dụng thậm chí không xuất hiện trên iPod touch của tôi. Nhưng sau đó tôi phát hiện ra rằng 'Khả năng thiết bị bắt buộc' (trong tab thông tin) có armv7 trong đó. Tôi vừa xóa nó và nó bắt đầu chạy hoàn hảo
Erpheus

1
Tôi thường sử dụng $ (VALID_ARCHS), phù hợp với tôi. Tôi vừa thấy rằng các dự án mới cũng thêm một yêu cầu năng lực 'arm7'. Tôi vừa xóa nó và tất cả hoạt động tốt.
Gordon Dove,

51

Câu trả lời đơn giản là bạn phải thay đổi cài đặt hiện tại từ "Standard (armv7) - $ (ARCHS_STANDARD_32_BIT)" thành "armv6" và "armv7". Xem hình ảnh bên dưới. Bạn phải xóa dòng có cài đặt trước đó để nó hoạt động.

Cài đặt chính xác cho armv6 và armv7


3
Cảm ơn bạn đã giải thích điều này bằng một hình ảnh - nó thực sự làm cho nó rõ ràng.
radven

11

cũng đảm bảo rằng bạn đặt điều này trong Dự án VÀ Mục tiêu ... tôi mất một giờ để tìm ra điều đó. đã đặt nó cho cái này chứ không phải cái khác. hi vọng điêu nay co ich. GLTA


Ngoài ra, nếu bạn có bất kỳ thư viện nào, bạn phải đặt nó trong dự án và mục tiêu ở đó.
William Jockusch

9

Tôi nghĩ rằng có một lý do tại sao Apple bỏ armv6 khỏi cài đặt tiêu chuẩn.

Tôi đã biên dịch armv7 / armv6 với iOS5 SDK, tuy nhiên, trình biên dịch armv6 đã tạo sai mã trong chế độ phát hành. Sau nhiều giờ tìm cách giải quyết (thử llvm hoặc gcc với các mức tối ưu hóa khác nhau), tôi bỏ cuộc.

Vì vậy, tôi sẽ quay lại iOS SDK 4.x miễn là tôi hỗ trợ các thiết bị armv6 cũ hơn.

Ví dụ về mã:

// myView center=(160, 100)
CGPoint p=myView.center;  
// now p=(100,100) (what the heck?)
p.x=myView.center.x;
p.y=myView.center.y;
// now p=(160,100) 
p.y+=100;
// now p =(200,200) (what the heck?)

Có thể tôi bị hỏng bộ nhớ, tuy nhiên, trên trình biên dịch armv7 và trên iOSSDK <5.0, nó hoạt động như mong đợi.

Trân trọng


Tôi cũng thấy các lỗi lạ trong bản dựng armv6 trên các thiết bị cũ hơn. Bạn đã tìm ra điều này hay thực sự quay lại một XCode trước đó? Ngoài ra, tôi lưu ý rằng họ không cho phép bạn tải xuống các SDK cũ hơn nữa!
Craig McMahon

19
Đây là sự cố đã biết với Trình biên dịch LLVM 3.0 trong cấu trúc Xcode 4.2 và CGPoint / CGSize: devforums.apple.com/thread/122059?tstart=15 . Việc vô hiệu hóa xây dựng cho Thumb trên armv6 sẽ ngăn chặn các loại lỗi này.
Brad Larson

Chà! Tôi rất vui vì câu trả lời của bạn, điều này cũng đang xảy ra với tôi.
Clafou

7

Không chắc liệu đây có thực sự là một giải pháp hay không, nhưng tôi đã phát hiện ra rằng việc thay thế chuỗi đã xác định trong "kiến trúc", là $ (ARCHS_STANDARD_32_BIT), bằng "armv6 armv7" đã cho phép tôi biên dịch với iOS5 làm cơ sở và iOS4 dưới dạng triển khai mục tiêu và vượt qua xác thực.

Tôi không sử dụng bất kỳ thư viện hoặc lệnh gọi nào dành riêng cho IOS5, nhưng có ý định sử dụng trong bản phát hành tiếp theo của mình.


1

Tôi không cần thay thế $ (ARCHS_STANDARD_32_BIT) chỉ bằng armv7 để ứng dụng biên dịch và được tải lên App Store.

Theo đề xuất của MarkGranoff, tôi chỉ cần thêm armv6 dưới dạng văn bản thuần túy, bằng cách nhấn dấu cộng và chỉ cần nhập nó vào dòng hai.

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.