文档章节

iOS 7: 如何为iPhone 5s编译64位应用

孙启超
 孙启超
发布于 2013/10/15 17:22
字数 1999
阅读 2446
收藏 56
随着 iPhone 5S的推出,大家开始关心 5S上所使用的 64位CPU A7。

除了关心A7的性能以外,大家还会关心一个问题,那就是使用A7的64位系统对应用有没有什么要求。特别是应用开发者,大家都比较关心我们的应用如何迁移到64位的系统上来,以充分发挥A7的能力。其实这些问题都可以在苹果的官方文档《64-Bit transition Guide for Cocoa Touch》中找到答案。

为了大家方便,我将《64-Bit transition Guide for Cocoa Touch》中的一些重点整理了一下,希望可以为大家节约一些详细阅读文档的时间,如果我理解有不对的地方请大家指正。

首先,A7使用的是ARM V8架构,除了使用64位的地址总线和64位的寄存器以外,还增加了寄存器的数量,目前A7中的整数和浮点数寄存器是A6的两倍。
这里需要强调的是,寄存器的增加大大提高了程序的运行速度。将CPU由32位提高到64位,最主要的改变增大了寻址能力,可以突破32位系统只能访问3G内存的限制(感谢   wanglang3081 指出这里的问题,32位系统在理论上可以访问4G内存,因为2的32次方约等于4 290 000 000,很多32位系统只能访问3G左右的内存是因为有一大部分地址被分配给I/O系统了,所以总体可用内存就不足4G了。),但是,32位到64位的改变并不一定意味着程序运行速度的提高,甚至有些情况下会因为64位系统中的数据占用内存变大而导致程序运行速度变慢。而寄存器数量的增加,则直接提高了程序运行速度,当然,前提是你的应用需要重新为64位系统编译一遍,让程序可以充分使用所有的寄存器。

使用Xcode 5可以很方便地将以前的应用编译成64位程序,基本过程如下:
1. 使用Xcode 5 打开原有项目。
2. 将支持的设备改成“iOS 7”。
3. 在“Build Setting”中将“Architectures”改成“Standard Architectures (including 64-bit)”。
4. 运行测试程序,解决编译过程出现的问题。

其中第4步是关键,具体会遇到什么问题和原来程序的设计有关,包括使用数据类型的方式是否标准等,后面会继续讨论细节,其实《64-Bit transition Guide for Cocoa Touch》一书主要就是讲这些细节。

在讨论细节之前有一些较为宏观的内容大家可以了解一下。

Xcode 5编译的iOS 7程序包含了32位和64位两套二进制代码,在32位的iOS系统上会调用32位的二进制代码,在64位系统上会调用64位的二进制代码,以此来解决向后兼容的问题。

同时,考虑到很多32位的程序可能在没有重新编译的情况下部署到64位系统上,64位的iOS系统中带有两套FrameWork,一套是32位的,一套是64位的。
当64位的iOS系统运行原来的32位程序时,系统会调用32位的FrameWork作为底层支撑,当系统运行64位程序时,系统会调用64位的FrameWork作为底层支撑。

也就是说,当一个iPhone 5S上同时运行32位程序和64位程序时,系统同时将32位和64位两套FrameWork载入了内存中,所以消耗的内存也比较多。

如果一台64位的iOS设备上运行的所有程序都是为64位系统编译过的,iOS系统将只载入64位的FrameWork,这将节省好多内存。所以,如果大家都可以快速将程序传换成64位的,iOS将跑得更快。真的是“大家好才是真的好”。


后面我们来看看一些为64位系统调整程序的技术细节。

32位的iOS系统和64位的iOS系统主要的差别有两个,一个是 数据类型 的差别,一个是 过程调用 方法 的差别。

数据类型 上,主要的变化是指针类型(Pointer)和长整数类型(long)的长度变化和内存对齐方式的变化,同时也导致了更高级别数据类型的变化,如NSInteger的长度也有变化。

过程调用方法 上,因为ARM V8 和ARM V7具有不同数量的寄存器,具有不同的过程调用约定,所以32位系统和64位系统在汇编层级是不同的。

根据以上两方面的变化,书中总结了以下要点,开发人员根据以下要点来检查原来的32位代码就差不多可以将应用移植到64位系统上了:

1. 不要将长整型数据(long)赋予整型(int)
这种代码在32位系统上没有问题,因为在32位系统中long和int的长度是一样的,不过在64位系统中就有可能出问题,因为64位系统中long比int长,将long值赋予int将导致数据丢失。

2. 不要将指针类型(Pointer)赋予整型(int)
为了方便地址计算,有时程序员会将指针类型赋予整型,这种代码在32位系统上没有问题,因为在32位系统中Pointer和int的长度是一样的,不过在64位系统中就会有问题,因为64位系统中Pointer比int长,将Pointer值赋予int将导致地址数据丢失,最终导致严重问题。

3. 留意那些和数位相关的数值计算
比如掩码技术,如果使用一个long类型的掩码,转到64位系统后高位都是0,计算出来的结果可能不符合预期。还有无符号整数和有符号整数的混用等。

4. 留意对齐方式带来的变化
如果在32位系统上定义一个结构包含两个long类型,第二个long数值的偏移地址是4,可以通过结构地址+4的方式获取,但是在64位系统上就不行了,因为在64位系统中第二个long数值的偏移地址是8。

5. 充分考虑在32位应用和64位应用之间的数据交换
因为用户会通过网络交换数据,同时用户保存的数据也可能通过备份等方式在32位系统和64位系统之间切换,所以应用在保存和发送流数据的时候一定要考虑充分。比如数据在32位系统中保存,在64位系统中能否正常打开,或者反过来,在64位系统中保存,在32位系统中打开是否正常。

6. 重写所有汇编代码
这点无需说明,如果你在代码中嵌入了汇编代码,你需要参考64位系统的指令集重写汇编代码。

7. 不要将可变参数的过程强制转换为定参过程,也不要将定参过程强制转换为可变参数的过程
这时因为32位系统和64位系统对于这两种过程调用方式的处理方法不同。


按以上几个重点去检查程序就差不多了,当然,具体的细节还有很多,需要在实际工作中结合代码和调试结果进行分析。
总之,建议具体负责应用迁移的开发者需要完整阅读《64-Bit transition Guide for Cocoa Touch》。

© 著作权归作者所有

孙启超
粉丝 123
博文 172
码字总数 276126
作品 0
浦东
高级程序员
私信 提问
加载中

评论(4)

园来如此
32位的服务器操作系统就能访问超过4g内存
张九
张九
收藏
MarvinGuo
MarvinGuo
64位的iOS系统中带有两套FrameWork,一套是32位的,一套是64位的。苹果以前做过很多次架构转型,所以这方面它有专利技术,mach-o flat binary 见http://en.wikipedia.org/wiki/Fat_binary,即在一个库中嵌入两套binary,所以,理论上iphone 5s的固件应该更大。
雨翔河
雨翔河
配置高啊
Xcode的Architectures和Valid Architectures的区别,以及st...

作者:shede333 主页:http://my.oschina.net/shede333 版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 [Creative Commons BY-NC-ND 3.0][] --- [Creative Commons BY-NC-...

shede333
2013/10/29
0
1
iOS 11 将不支持多年没更新的 32 位应用

在未来版本的 iOS 系统中,苹果可能要移除对 32 位应用的支持了。几天前,苹果发布了 iOS 10.3 第一个测试版,在 iOS 10.3 中开启 32 位应用时,提示窗口上显示应用需要更新才能在未来版本的...

局长
2017/02/01
1K
3
为什么64位手机处理器比你想象地重要?

全世界都知道苹果发布了64位处理器的手机,有人说它只是一个营销噱头,有人说它这是在长线布局,但今天theverge给了我们另一个说法,力图证明64位处理器的伟大意义。 ARMv8架构其实并不新鲜,...

oschina
2013/09/14
6.3K
41
报告称 iPhone 5s 应用崩溃率为 iPhone 5/5c 两倍

新浪科技讯 北京时间10月11日晚间消息,移动应用基础设施提供商Crittercism最新数据显示,iPhone 5s应用崩溃率为iPhone 5/5c的两倍。 Crittercism称,iPhone 5s的应用崩溃率约为2%,而iPhon...

oschina
2013/10/12
4.9K
22
确认了! iOS 11 将完全停止支持 32 位应用

苹果正在逐渐淘汰 32 位应用,而且会在今年秋天完成。根据知名开发者 Steven Troughton-Smith 透露,苹果会在 iOS 11 发布后,停止支持 32 位应用。这意味着 App Store 中所有的 32 位应用将...

两味真火
2017/04/10
2.3K
16

没有更多内容

加载失败,请刷新页面

加载更多

分布式架构 共享session的常见解决方案

在使用分布式架构时,会遇到分布式架构常见的几个问题: 分布式事务、接口幂等性、分布式锁和分布式 session。 分布式session 一、什么是session 浏览器在访问一个web服务的时候,会在浏览器...

太猪-YJ
22分钟前
2
0
Android java.lang.NoClassDefFoundError:failed resolution of :Lorg/apache/http/ProtocolVersion解决方案

这是GooglePlay Services方面的一个bug,在修复之前,可以通过将此添加到AndroidManifest.xml内部<application>标签: <uses-library android:name="org.apache.http.legacy" android:requir......

醉雨
27分钟前
0
0
蚂蚁金服 Service Mesh 落地实践与挑战 | GIAC 实录

本文整理自 GIAC(GLOBAL INTERNET ARCHITECTURE CONFERENCE)全球互联网架构大会,蚂蚁金服平台数据技术事业群技术专家石建伟(花名:卓与)的分享。分享基于 Service Mesh 的理念,结合蚂蚁...

SOFAStack
33分钟前
1
0
Java跨平台原理

此篇博文主要源自网络xiaozhen的天空的博客:http://xiaozhen1900.blog.163.com/blog/static/1741732572011325111945246/   1、是么是平台 Java是可以跨平台的编程语言,那我们首先得知道什...

vinci321
33分钟前
1
0
分享 KubeCon 2019 (上海)关于 Serverless 及 Knative 相关演讲会议

有幸参加了 KubeCon 2019 上海大会,并参加了 Knative 及 Serverless 相关的几场分享会,收获满满。这里简单介绍一下各个演讲主题的主要内容。详细的演讲主题文档可以在KubeCon官方获取:htt...

阿里云官方博客
42分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部