繁体   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