引言
从2012年自学iOS开发以来,经常会有周围朋友、同事问我:"你是怎么从零开始,成为一个优秀的iOS开发者?"。对于“优秀”,我会觉得惭愧。在搜狐的内部交流会上,在北京的行业分享会上,当你更很多优秀的人一起探讨各种技术栈,你会发现自己其实只是偏隅一角,好似iOS研发滔滔江河中的一叶扁舟。
复盘这几年iOS开发经验,我提炼为“站在iOS系统上,以俯瞰的视角学iOS开发”,希望能给那些想转型iOS或者初级的iOS工程师提供帮助。
“登高望远天地阔,纵横捭阖自从容”,站在一个更高的高度,你可以完整的俯瞰整个iOS的运转体系。当然,很多人会问:“你这不是说的废话吗,谁都知道站得高看得远,那如何站在更高的高度?”
对于iOS开发来说,当你深入理解iOS的系统架构,你才能清晰理解手指触摸屏幕后事件的传递和响应机制;你才能明白为什么图像渲染的机制;你才能对于那些情况会造成性能瓶颈并提供优异的性能优化方案......总之,把握iOS系统全局,对于iOS开发,你会事半功倍。
这篇文章会从iOS系统开始讨论,介绍iOS系统的发展史并深挖iOS系统架构及其内核等。
iOS操作系统
了解一些操作系统的发展史以及系统架构的背景,有助于更好理解系统架构模型和设计思想。本文不过多讲解操作系统,概念性的知识会一笔带过。
1. 操作系统发展史
操作系统的历史在某种意义上来说也是计算机的历史。操作系统提供对硬件控制的调用和应用程序所必需的功能。
2. 乔布斯与苹果
3. iPhone产品
4. iOS系统
iOS是苹果公司开发的移动操作系统 。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统(最初叫iPhone runs OS X)。该系统最初是设计给iPhone使用的(所以后来曾命名为iPhone OS),之后陆续套用到iPod touch、iPad以及Apple TV等产品上(所以在WWDC2010上最终宣布更名为iOS)。
讲到iOS系统,我们不得不提到Mac OS,毕竟两者之间有着千丝万缕的联系。macOS,2012年前称之为Mac OS X,2012 - 2016年称OS X,2016年起称macOS,是苹果公司推出的图形用户界面操作系统。iOS,原名iPhone OS,2007年1月9日,发布iPhone OS,2010年WWDC大会宣布改名为iOS。是苹果公司为移动设备所开发的移动操作系统。无论是iOS还是macOS,都是类Unix操作系统。
- iOS系统是OS X 应对移动平台的分支,本质上iOS就是Mac OS X。拥有一样的操作系统层次结构以及相同的操作系统核心Dawin。
- iOS 的内核闭源(苹果2017年开源了iOS的XNU内核代码),OS X内核是开源的;
- iOS 的GUI是SpringBoard,OS X的是 Aqua。前者针对触屏,后者是鼠标驱动的窗口系统。
- iOS app不允许访问底层的Darwin,也没有root访问权限,并且只能访问自己目录内的数据。
- 苹果竭尽全力确保iOS作为一个移动平台操作系统的封闭性。这个特性主要是通过文件目录隔离实现的,正常的app安装在Applications/ 目录,只有有限的权限。在越狱系统中,可以将app安装在System/ 目录,以获取更多系统权限。
核心知识
重点来了,既然本文叫《站在高处看iOS开发 ——— 深入浅出iOS操作系统》,那我们就需要捋清楚深入学习iOS之前的核心知识和一些重要概念。
-
Macintosh && Mac && 麦金塔
苹果公司自1984年起以“Macintosh”开始开发的个人消费型计算机;Mac是Macintosh简称;麦金塔是Macintosh的中文翻译。
-
NeXT && NeXTSTEP
NeXT是早期乔布斯离开苹果公司后进入的公司。NeXT公司生产专用硬件,这些硬件运行专有的操作系统 —— 。
- NeXTSTEP虽然最终偏离了作为更优秀操作系统应该走的道路,但是在Mac OS系统中占据重要的地位。
- NeXTSTEP采用Mach微内核系统,开发语言为Objective-C,面向对象的操作系统,并且提供了很多framework和Kit,拥有丰富的GUI开发。
-
Mac OS Classic && Mac OS X && OS X && Mac OS
Mac OS Classic是早期的苹果操作系统,拥有伟大的GUI,但系统设计却非常糟糕;
Mac OS是乔布斯回归苹果后,结合Mac OS Classic和NeXTSTEP开发的新一套苹果操作系统,在2012年的称呼为Mac OS X,2012 - 2016年之间称呼为 OS X。
-
iPhone OS && iOS
iPhone是苹果手机系统的一种早期称呼方式。2010年WWDC大会宣布iPhone OS改名为iOS。
-
Darwin && XNU && Mach && BSD
-
Darwin
核心操作系统层就是我们经常提到的Darwin,Darwin(达尔文)是苹果公司于2000年发布的一个开源操作系统,Darwin是macOS 和 iOS的一部分。可以将Darwin理解为操作系统的代号。Darwin由XNU和一些其他的Darwin库组成。 -
XNU
XNU是由苹果公司发布的操作系统内核,即Darwin的内核是XNU,是Darwin操作系统的一部分。除macOS外,XNU还是iOS、tvOS、watchOS操作系统的内核。XNU是X is not Unix的缩写。XNU包含三部分:Mach内核、BSD、I/O Kit。 -
Mach
XNU内核以一个被深度定制的Mach3.0内核作为基础。Mach是一个由卡内基梅隆大学开发的计算机操作系统微内核,主要是为了用于操作系统研究,特别是在分布式与并行运算上。XNU中的Mach所负责的功能非常少(核心功能),只能完成操作系统最基本的职责,比如任务调度、消息传递、进程间通信等。 -
BSD
BSD,伯克利软件套件(Berkeley Software Distribution),也被称为伯克利Unix(Berkeley Unix),是一个操作系统的名称。XNU中的BSD部分提供了POSIX应用程序接口(BSD系统称之为API):进程模型、网络协议栈、虚拟文件系统等。 -
I/O Kit
I/O Kit是一个设备驱动框架,为开发者提供了开发设备驱动程序的API。
-
Darwin
-
用户体验层(Application)&& 应用框架层 (Cocoa)&& 媒体层 (Media)&& 核心服务层 (Core Services)&& 核心系统层 (Core OS)
这几个概念组成了iOS的系统架构,在苹果的官方开发文档中有一幅图介绍了这几个概念的关系。我有一篇文章详解介绍了站在高处看iOS开发 ——— iOS系统架构。
UNIX的系统目录
OS X是一个符合UNIX标准的系统,因此也有那些标准UNIX具有的目录结构:
/bin: UNIX中的二进制程序。这是常用UNIX命令(例如ls rm mv df)所在的地方
/sbin:系统程序。这些二进制程序用于系统管理,例如文件系统管理和网络配置等。
/usr:User目录。这并不是说这个目录是给用户用的。更像是Windows中的 Program Files目录,第三方软件可以安装在这里。
/usr: 目录中包含的bin sbin 和 lib。/usr/lib用于存放共享的目标文件(类似于Window中存放DLL文件的\windows\system32目录)。这个目录还包含一个include/子目录,所有标准的C头文件都存放在此。
/etc: 其他文件。这个目录包含了大部分系统配置文件,例如密码文件(/etc/password)。在 OS X中,这个目录实际上是指向/private/etc都符合链接。
/dev:BSD设备文件。
/tmp:临时目录。在OS X中,这个目录实际上是指向/private/tmp都符号链接。
/var:各种杂项文件。这个目录中保存了日志文件,邮件存储,打印队列和其他数据。在 OS X中这个目录实际上是指向/private/var的符号链接。
iOS作为OS X的一个分支,和 OS X 非常类似的文件系统目录,但是有以下区别:
- 没有/Users目录,只有一个/User目录,实际上是指向/var/mobile的符号链接。
- /Developer目录只有在iOS设备被Xcode选中为“Use for development”时才会出现。在这种情况下,iOS SDK中的 DeveloperDiskImage.dmg 镜像会在设备上挂载。
参考书籍
- 《Mac OS X and iOS Internals: To the Apple’s Core》 by Jonathan Levin
- Kernel Programming Guide