实战iOS应用从32位升级到64位
苹果官方会在2015年2月1日不允许不支持arm64的应用的提交,这对我们这种开发移动应用产品的人来说是一把达摩克利斯之剑。我前面写过一篇文章《iOS上应用如何兼容32位系统和64位系统》,但那还是纸上谈兵阶段,没有进入实战。到2015年1月份,我终于在应用提交了一次新的稳定版本后,开始进行应用的arm64升级。
1. 准备
我们的应用是多媒体的播放器,牵涉到了ffmpeg/SDL等著名的开源第三方。因为项目中并非把这些项目的源码直接引入,而是通过打库链接到项目的方式来使用,那么所有的第三方的库都需要使用支持arm64的库。
如果你不能确定库是否支持了arm64,可以在cmd模式下用file命令来检查一下库文件。
测试的真机,包括32位的设备和64位的设备。
2. 增加arm64的architecture
这个没什么说的,在项目Build Settings页面下Architectures和Valid Architectures两个设置项都设置成${ARCHS_STANDARD} 即可。
这里有一个细节提一下,在Xcode5中,${ARCHS_STANDARD}是指armv7,armv7s和arm64;而在Xcode6中,${ARCHS_STANDARD}是指armv7,arm64,其中armv7s被苹果抛弃了。
《Xcode 6 drops armv7s》这篇文章详细讲述了这一点。
3. 实际中需要注意的几个地方
I)汇编代码
如果你有汇编语言的源码,那么是件比较让人头疼的事情。因为32位架构和64位架构有及其巨大的区别,根本不可能混用代码。而一般使用汇编语言的地方都是很重要的核心部分,这种情况遇到只能具体问题具体分析了。
II)sizeof
我在代码中是比较喜欢是使用sizeof的,因为感觉会比较容易移植,系统会自动帮我们计算具体的大小,而不用自己手动一一计算。但这次sizeof还是带来了一定问题的。
我遇到的场景是我的应用需要和一个硬件设备有一定的数据交互,会互相发送命令。这个硬件设备是独立于应用程序的,显然,我需要保证和硬件的命令内容的接收、发送和处理都是严格按照以前定下的协议工作的。但32位和64位对于一些类型的解释长度是不同的,这样就会带入一些问题。最典型的类型是long,size_t和指针,最后要兼容真的花了一番功夫。
其实,还有一个场景这个问题也很明显——云上的内容,因为云上的内容无法确定下一个访问的是32位应用还是64位应用,所以同样会遇到这些困难。
总结起来看呢,在要求数据结构在32位和64位下要解释一样的场景下,使用就要小心了,尤其是malloc(sizeof(x))这种使用方法。
III)指针和整数的互换
这个恶劣的先例是microsoft率先开启的,在win32下官方代码都充斥这样的指针和int互相转型,当时的逻辑是因为都是4个bytes的,所以内容没有任何损失,这个做法是安全的。
时过境迁,这样的代码在现在就结出恶果了,如果你代码中留存着这样的技巧写出来的内容,那么,你就一面诅咒microsoft一面自行修改吧,^_^
IV)恶劣而随意的代码
比如:int和NSInteger不区分,unsigned int和NSUInteger不区分等等,一些写代码不太严谨的程序员,真的是充斥着这样的代码,这两个例子在32位中运行是没有问题的,所以真的是不难看到,但是,64位下不是这样的,以前很随意的代码,现在都要付代价了。
剩下还有一些诸如format的问题,函数必须有声明等等的问题,这些在实际升级过程中倒是没有带来太大的麻烦(当然,这可能和我应用的类型相关)。我遇到的最大的麻烦是以上列举的4点。
最后,这样升级的应用要进行足够的测试,包括32位真机和64位真机,必须进行压力测试。
实战iOS应用从32位升级到64位相关推荐
- 网站服务器 64位,如何将win7系统从32位升级到64位_网站服务器运行维护,win7,32位,64位...
win10如何重置此电脑_网站服务器运行维护 win10重置此电脑的方法是:1.点击[开始]按钮,进入设置:2.进入[更新和安全]选项,点击[恢复]:3.找到[重置此电脑],点击[开始]:4.选择[保 ...
- php int 32 64,php从32位升级到64位需要注意的几点
php从32位升级到64位需要注意的几点 (2011-03-20 20:49:46) 标签: 杂谈 分类: php php升级到64位,代码要注意的问题: 1.整型问题. 32位操作系统,php用4个 ...
- 数据库32位升级到64位解决方案
数据库32位升级到64位解决方案 一.背景介绍 突然发现本机64位操作系统下,装的是32位数据库,现想将32位库升级到64位数据库. 该操作同样适用于库损坏,只剩数据文件.控制文件.日志文件等文件的情 ...
- 【Bug】一次Android系统应用32位升级到64位的踩坑记录
项目场景: 二期会议室需要替换成OD20的会议平板,为了方便安装,给了framework的同事一个会议室版本的无线投屏APK,作为系统应用打包进去了. 将无线投屏升级到现在调试的版本,启动后,底部通知 ...
- oracle 10g 10.2.0.4 32位升级到64位
32位升到64位有以下几种方法: 1.copy datafile后运行脚本升级 2.rman restore后运行脚本升级 3.通过exp/imp,expdp/impdp的transfer table ...
- php 32升64位,电脑怎么从32位升级到64位?
笔者年轻时,在大学里读的是计算机科学与技术专业,关于电脑的位数问题,还是印象很深刻的.对于没有专业知识的人来讲,刚开始理解这个问题,可能会有一定的难度,笔者竭尽自己所能,力求把这个问题说明白,不周之处 ...
- 32位oracle10,Oracle10g32位升级到64位方法
原环境windows 2003 Server 32位和Oracle10g 10.2.0 32位 IBM 3850两台+IBM DS3400磁盘阵列组成双机 升级之前很忐忑,因没有升级过,怕升级失败,因 ...
- win7升级php,win7系统如何从32位升级到64位
下载win7 x64系统iso镜像到本地,右键使用WinRAR等工具解压出来. 将win7.gho文件和Onekey ghost工具放到同一目录,比如D盘,不要放C盘或桌面. 双击打开Onekey g ...
- 32位程序和64位程序
我们有时候会遇到这样一种情况:我们在32位操作系统上下载了64位版本的程序,却发现无法安装,大家可能会很困惑. 下面就来简单解释一下32位程序与64位程序的具体区别. 我们首先要弄明白的: 1.这里所 ...
最新文章
- ceph存储引擎bluestore解析
- 人为何会发烧,超过42°C会怎样?
- 创建细分客户的无监督学习项目
- 在电商界摸爬滚打10年,我学到这三点经验教训
- php写的微信聊天界面,浅谈 聊天界面 核心架构设计
- Windows下使用Java API操作HDFS的常用方法
- 居然不知道和的区别?
- 网络编程模型综述 之 成熟的IO框架介绍
- 二陈丸配什么吃不上火_宝妈一个人带孩子是什么感觉?前三种场景,不知道是怎么熬过来的...
- 使用PHP建立SVN的远程钩子,使用exec命令自动更新SVN的代码
- springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel
- mysql 聚簇_mysql索引总结(3)-MySQL聚簇索引和非聚簇索引
- ======第四章存储器管理======
- java如何取到配置文件中值,从配置文件中获取配置信息的几种方法
- LNMP - nginx代理详解
- 开启es6——搭建开发环境
- java web 中的servlet讲解
- 爬虫的一些知识点 目录 1. 网络爬虫	1 2. 产生背景 垂直领域搜索引擎	2 3. 1 聚焦爬虫工作原理以及关键技术概述	3 4. 涉及技术	3 4.1. 下载网页 一般是通过net api
- 梦幻西游新资源的提取一
- Proteus里设置任意电源值的POWER的实现