簡體   English   中英

如何制作將在iOS 5到7上運行的armv7 arm64 fat二進制文件?

[英]How do I make a armv7 arm64 fat binary that will run on iOS 5 through 7?

Apple多年來改變了教學方式。 由於單個程序可能需要在多種機器上運行,因此Apple使用由名為“lipo”的工具構建的“胖二進制文件”。 你告訴Xcode多次編譯你的程序,每種機器類型一次,lipo將它們綁定在一起。

Apple最近推出了針對iOS的第四個指令集。 第一部手機使用的是Armv6,來自3GS,我們有Armv7,為Armv7s添加了一些新指令,現在,5S增加了Arm64。

我喜歡我的程序在一系列操作系統下運行,因此我將MIN_DEPLOYMENT_TARGET設置為5.0,因此Apple將在5.0以上的機器上加載程序。 但是當在當前版本的Xcode中嘗試時,我收到一條錯誤消息,說在Arm64中是不可能的。

好的,我設置了一個條件構建設置:對於Arm64以外的架構,MIN_DEPLOYMENT_TARGET為5.0,但Arm64的設置為7.0。 現在程序編譯,鏈接和脂肪。 但是現在,由於其中一個編輯只是iOS 7.0,我得到一堆警告,我的程序包含對舊操作系統的調用。 我知道。 這是故意的 - 所以程序將在那些舊系統上運行。 在iOS 7系統上,不調用那些舊例程,而是在運行時,程序調用它們的現代替換。 我可以讓編譯器停止抱怨:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// old code here.
#pragma clang diagnostic pop

該程序在iOS 7設備上運行良好,包括Armv7和Arm64。 一些診斷代碼驗證在Arm64設備上運行時,實際上正在使用Arm64分支。

在二進制文件上運行lipo報告它具有預期的體系結構。

但是,這是一個很大的問題:當我嘗試在iOS 5設備上安裝應用程序時,Xcode只是發出警告:“存在內部API錯誤。”

我認為iOS 5和iOS 6中存在一個錯誤,因此他們不會忽略未來的分叉。 加載器應該簡單地忽略它無法識別的分叉。 但這不是它的工作方式。

Apple永遠不會修復iOS 5.我認為當應用程序加載到設備上時Apple可能會解決這個問題:讓Xcode剝離不需要的fork,然后重新簽名(現在修改過的)二進制文件。 同樣,從iTunes下載可能會刪除不需要的分叉並重新簽名。 但蘋果不太可能這樣做:Apple希望每個人都可以升級到iOS7。 對於那些無法升級的人而言,Apple解決方案是:購買新硬件。

所以,我們被困住了。 您可以在應用程序商店中擁有支持5和6的單個標題,並發出7個胖胖armv7和arm64的更新,因此擁有iOS7的用戶將獲得胖,而擁有5或6的用戶將獲得舊的,但你只能做一次。 發布7更新后,您再也無法更新5和6更新。

有沒有解決的辦法? 我想要一個在Armv7和Arm64上運行的程序,以及用於armv7方面的iOS 5和6,用於armv7的iOS 7更難以支持arm64和支持的iOS 7 arm64,如何?

在iOS 5上無法打開具有64位條帶的二進制文件。這是操作系統級別的限制,並且沒有辦法解決它。 一般來說,不再需要支持iOS 5,但我確信某個地方有人有正當理由支持它,希望他們能找到這個問題。

如果您必須支持iOS 5,則必須刪除64位的條子。 我這並不妨礙您的應用程序在64位系統上運行。 它只是使它作為32位應用程序運行。 大多數用戶甚至都不會注意到差異。

截至目前的Xcode版本(5.0版(5A1412)):

注意:未來版本的Xcode將允許您創建一個支持iOS 6及更高版本上的32位運行時的應用程序,並支持iOS 7上的64位運行時.Apple Source

Apple在iOS 5.1中解決了這個問題,所以,如果你將min-deployment-target設置為5.1,那么你可以創建一個32/64胖的二進制文件,它可以在5.1上運行。 我在5.1出來之前寫了原始問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM