苹果官方会在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位相关推荐

  1. 网站服务器 64位,如何将win7系统从32位升级到64位_网站服务器运行维护,win7,32位,64位...

    win10如何重置此电脑_网站服务器运行维护 win10重置此电脑的方法是:1.点击[开始]按钮,进入设置:2.进入[更新和安全]选项,点击[恢复]:3.找到[重置此电脑],点击[开始]:4.选择[保 ...

  2. php int 32 64,php从32位升级到64位需要注意的几点

    php从32位升级到64位需要注意的几点 (2011-03-20 20:49:46) 标签: 杂谈 分类: php php升级到64位,代码要注意的问题: 1.整型问题. 32位操作系统,php用4个 ...

  3. 数据库32位升级到64位解决方案

    数据库32位升级到64位解决方案 一.背景介绍 突然发现本机64位操作系统下,装的是32位数据库,现想将32位库升级到64位数据库. 该操作同样适用于库损坏,只剩数据文件.控制文件.日志文件等文件的情 ...

  4. 【Bug】一次Android系统应用32位升级到64位的踩坑记录

    项目场景: 二期会议室需要替换成OD20的会议平板,为了方便安装,给了framework的同事一个会议室版本的无线投屏APK,作为系统应用打包进去了. 将无线投屏升级到现在调试的版本,启动后,底部通知 ...

  5. oracle 10g 10.2.0.4 32位升级到64位

    32位升到64位有以下几种方法: 1.copy datafile后运行脚本升级 2.rman restore后运行脚本升级 3.通过exp/imp,expdp/impdp的transfer table ...

  6. php 32升64位,电脑怎么从32位升级到64位?

    笔者年轻时,在大学里读的是计算机科学与技术专业,关于电脑的位数问题,还是印象很深刻的.对于没有专业知识的人来讲,刚开始理解这个问题,可能会有一定的难度,笔者竭尽自己所能,力求把这个问题说明白,不周之处 ...

  7. 32位oracle10,Oracle10g32位升级到64位方法

    原环境windows 2003 Server 32位和Oracle10g 10.2.0 32位 IBM 3850两台+IBM DS3400磁盘阵列组成双机 升级之前很忐忑,因没有升级过,怕升级失败,因 ...

  8. win7升级php,win7系统如何从32位升级到64位

    下载win7 x64系统iso镜像到本地,右键使用WinRAR等工具解压出来. 将win7.gho文件和Onekey ghost工具放到同一目录,比如D盘,不要放C盘或桌面. 双击打开Onekey g ...

  9. 32位程序和64位程序

    我们有时候会遇到这样一种情况:我们在32位操作系统上下载了64位版本的程序,却发现无法安装,大家可能会很困惑. 下面就来简单解释一下32位程序与64位程序的具体区别. 我们首先要弄明白的: 1.这里所 ...

最新文章

  1. ceph存储引擎bluestore解析
  2. 人为何会发烧,超过42°C会怎样?
  3. 创建细分客户的无监督学习项目
  4. 在电商界摸爬滚打10年,我学到这三点经验教训
  5. php写的微信聊天界面,浅谈 聊天界面 核心架构设计
  6. Windows下使用Java API操作HDFS的常用方法
  7. 居然不知道和的区别?
  8. 网络编程模型综述 之 成熟的IO框架介绍
  9. 二陈丸配什么吃不上火_宝妈一个人带孩子是什么感觉?前三种场景,不知道是怎么熬过来的...
  10. 使用PHP建立SVN的远程钩子,使用exec命令自动更新SVN的代码
  11. springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel
  12. mysql 聚簇_mysql索引总结(3)-MySQL聚簇索引和非聚簇索引
  13. ======第四章存储器管理======
  14. java如何取到配置文件中值,从配置文件中获取配置信息的几种方法
  15. LNMP - nginx代理详解
  16. 开启es6——搭建开发环境
  17. java web 中的servlet讲解
  18. 爬虫的一些知识点 目录 1. 网络爬虫 1 2. 产生背景 垂直领域搜索引擎 2 3. 1 聚焦爬虫工作原理以及关键技术概述 3 4. 涉及技术 3 4.1. 下载网页 一般是通过net api
  19. 梦幻西游新资源的提取一
  20. Proteus里设置任意电源值的POWER的实现

热门文章

  1. 7-1 sdust-Java-字符串集合求并集 (20 分)
  2. Android热更新初探,Bugly热更新的集成和使用(让你的应用轻松具备热更新能力)
  3. IE常见问题解决方案大全
  4. CSR867x — 广播数据设置接口以及如何添加厂商数据
  5. Data Science 到底是什么?
  6. 作为 IT 从业人员,你觉得有什么工具大大提高了你的工作效率?
  7. MineCraft - 创世神插件
  8. 搜狗都上市了,王小川还是单身,难道要找AI当女朋友?
  9. VMware虚拟机如何开启雷电模拟器的VT?
  10. python 卡方分布值_python数据分析探索变量之间的关系