iOS实际上是完整OS X精简之后的版本, 和OS X有两大主要区别:
- iOS的架构是基于ARM(而不是Intel x86 或 x86_64)
- 为了满足移动设备的局限性或特性需求, 有一些组件被简化了或干脆被移除了.诸如GPS, 动作感应和触摸等概念最早是出现在iOS上的. 现在这些概念正逐步整合进主流的OS X Lion中
2.1 OS X 架构概述
OS X & iOS层次结构 |
---|
用户体验层 |
应用框架层 |
核心框架层 |
Darwin |
-
用户体验层: iOS中包括SpringBoard支持Spotlight(用来搜索安装的应用)
OS X中则包括Aqua Dashboard Spotlight 和辅助功能(accessibility)等 -
应用框架层: iOS中只有Cocoa的衍生品 Cocoa Touch
OS X包括Cocoa Carbon Java - 核心框架层: 又称为图形层和媒体层, 包括核心框架 OpenGL QuickTime
- Drawin: 操作系统核心, 包括内核和UNIX shell环境
Drawin架构

实际上是Mach 和 BSD两种技术的混合
OS X特有的文件目录
- /Application
- /Developer
- /Library
- / Network
- /System
- /Users
- /Volumes
- /Cores: 如果启用了核心转储, 那么这个目录保存核心转储文件.
iOS文件系统
- 文件系统大小写敏感, 而OS X大小写不敏感
- iOS中内核缓存是加密的Img3文件, OS X内核缓存为压缩镜像
- /Applications
- /User: 没有Users目录, 只有一个User目录
- /Developer 目录只有在iOS设备被Xcode选中为"Use for development"时才会出现, 在这种情况下, iOS SDK
bundle
苹果对bundle的定义时:"一种标准化的层次结构, 保存了可执行代码以及代码所需要的资源".
Bundle的基本目录结构:
Contents/
CodeResources/
Info.plist 包的主mainfest文件
MacOS/ 包中的二进制文件内容
PkgInfo 包的8字节标识符
Resources/ .nib文件(用于GUI)和.Iproj文件
Version.plist 包版本信息
CodeSignature/
CodeResources
在iOS中, app的结构并没有严格要求, 有可能所有的文件都会被丢在根目录下. 有些文件会有特殊要求, 比如国际化文件会被要求放在xxx.Iproj目录下, xxx表示语言或ISO语言代码
另外, 苹果会区分自己提供的默认应用程序和通过App Store购买的应用程序, 他们分别被放在/Applications目录和/var/mobile/Applications下
App将会被安装在一个表示为128位的GUID的目录下面, 比如: A8CB4133-414E-4AF6-06DA-210490939163
GUID目录的结构
iOS app目录下的元素 | 用途 |
---|---|
Documents | 应用程序保存的数据文件 |
iTunesArtwork | app的高分辨率图标 |
iTunesMetaData.plist | app的属性列表文件 |
Library/ | 杂项app文件, 这个目录下包括Caches, Cookise和Preferences等 |
tmp | 保存临时文件的目录 |
从Appstore上面下载的ipa包实际是一个zip包, 文件在Payload/目录下压缩了应用程序的目录内容.



Info.plist
Info.plist文件位于应用程序(以及其他大部分bundle)的Contents/子目录下, 这个文件保存了bundle的元数据信息. 这个文件是必备的, 操作系统通过这个文件判定了依赖关系和其他属性.
一个标准的Info.plist文件包含以下条目
- CFBundleDevelopmentRegion: 如果找不到用户指定的语言, 则表示默认的语言
- CFBundleDisplayName: 显示给用户的bundle名称
- CFbundleDocumentTypes: 这个bundle关联的文档类型. 这是一个字典, 字典中的指制定了这个bundle能够处理的文件扩展名. 这个字典还指定了对于关联文档显示的图标.
- CFBundleExecutable: 这个bundle中实际的可执行文件(二进制文件或库文件). 可执行文件位于Contents/MacOS目录, iOS位于Payload下App应用目录中
- CFBundleIconFile: App的显示图标
- CFBundleidentifier: 逆DNS表示法的标识符, 例如: org.ribaba.Measure-Your-Land
- CFBundleName: bundle的名称(限制在16个字符之内).
- CFBundlePackageType: 表示一个4字母的代码, 声明打包的类型, 例如: APPL=Application FRMW=framework BNDL=bundle
- CFBundleSignature: 表示bundle的4字母短名 下图中为????
- CFBundleURLTypes: 这个bundle关联的URL, 制定这个bundle处理的URL scheme以及处理方式
以上所有的键都是以CF开头的, 表示这些键都是Core Foundation框架定义并处理的. Cocoa应用程序还包含NS开头的键, 定义了应用程序是否允许脚本操作 Java需求, 以及和系统偏好设置应用程序面板的综合能力, 大部分的NS开头的键只能适用于OS X 而不能用于 iOS

Resources目录
包含了程序要求使用的所有文件, 这是使用bundle格式的一大好处, 与其他操作系统不同的是, 系统不会要求资源文件被编译进可执行文件中, bundle允许资源文件保持独立, 这样就缩小了可执行文件的体积, 同时更新资源文件时不需要重新编译.
资源文件可以使各种类型的, 但是有几种类型的资源文件会占有比较高的出镜率:
1. NIB文件
.nib文件是二进制的plist文件, 其中保存了应用程序中GUI组件的位置信息和设置信息. 这些文件是通过Xcode的Interface Builder创建的, Interface Builder编辑.xib文件的文件版本, 然后再将这些文件打包成二进制格式. 这个文件是一个属性列表, 在OS X 和 iOS上都保存为二进制形式. 可以将nib文件反编译会xml文件, 不过这样一来会造成一些信息的丢失.
2. Iproj文件
国际化文件, 文件夹中包含针对指定语言本地化的字符串, nib文件和多媒体文件
3. 图标文件(.icns)
包含一个或多个视觉形象的图标
4. CodeResources
应用程序中包含的最后一个重要文件是CodeResources, 这实际上是一个指向_CodeSignature/CodeResources的符号链接. 这个文件是一个属性列表, 包含bundle中所有其他文件的列表. 这个属性列表只有个一项files, 这是一个字典, 其中键是文件名, 值通常是Base64格式的散列值, 如果键表示文件是可选的, 那么值本身也是一个字典, 字典有一个hash键和一个optional键.
CodeResources文件可以用于判断一个应用程序是否完好无损,能够防止不小心修改或损坏资源文件.

框架
在iOS中, 框架是一个重要的组件(framework). 框架就是bundle, 包含一个或多个共享库以及支持文件.
1. 框架bundle格式
和应用程序(以及OS X上大部分其他文件)一样, 框架实际上是bundle. 因此, 框架具有固定的目录结构:
CodeResources/ 指向Code Signature/CodeResources plist文件的符号链接
Headers/ 指向这个框架提供的.h文件所在目录的符号链接
Resources/ 指向这个框架所需要的.nib文件(用于GUI), .lproj文件和其他文件所在目录的符号链接
Versions/ 在这个子目录下实现版本控制
A/ 子目名称的目录表示这个框架的版本
Current/ 指向这个框架首选版本的符号链接
framework-name 指向这个框架首选版本的二进制文件的符号链接
可以看出, 框架bundle和应用程序bundle的格式稍有不同. 主要的区别在于内建的版本化机制: 框架可以包含多个版本的代码, 不同版本并排放在不同的子目录, 例如Versions/A Versions/B 以此类推, 首选版本可以通过创建名为Current的符号链接轻松切换. 框架文件本身都连接到选中的版本文件. 尽管大部分的框架只有一个版本, (通常使用A, 但有时候会使用B或C), 这种架构还允许前向和后向兼容.
库
框架可以说就是一种特殊形式的库. 实际上, 框架中的二进制文件就是库. 苹果强调这两个名词之间的区别, 因为与库相比, 框架更倾向于是OS X(和iOS)特有的, 而库则是所有UNIX系统共有的.
OS X和iOS将"传统"的库保存在/usr/lib目录中(不存在/lib目录). 库文件是用.dylib后缀, 而不是其他UNIX上常用的ELF格式的.so文件.
OS X还自带了很多其他开源的库, 这些库都包含在Darwin中, 这些库包括OpenSSL, OpenSSH, libZ, libXSLT以及其他很多库.
其他应用程序类型
- Java(仅限于OS X)
OS X包含一个和Java 1.6完整兼容的Java虚拟机 - Widget
- BSD/Mach原生程序
可以使用C/C++语言编写原生应用程序
XNU概述
内核XNU是Darwin的核心, 也是整个OS X的核心, XNU本身由以下几个组件构成
- Mach微内核
- BSD层
- kbKern
- I/O Kit
Mach
XNU的核心, "原子核", 可以认为就是Mach, 这个微内核仅能处理操作系统最基本的职责:
- 进程和线程抽象
- 虚拟内存管理
- 任务调度
- 进程间通信和消息传递机制
Mach本身的API非常有限, 而且本身也不是设计为一个具有全套功能的操作系统, 苹果不鼓励使用Mach的API, 不过可以看出来, 这些API非常基础, 如果没有这些API的话, 其他工作都无法实施. 任何额外的功能, 例如文件和设备访问, 都必须在此基础上实现, 而这些额外的功能都是BSD层实现的.
BSD层
BSD层建立在Mach之上, 也是XNU中一个不可分割的部分.
- UNIX进程模型
- POSIX线程模型(Pthread)及其相关的同步原语
- UNIX用户和组
- 网络协议栈(BSD Socket API)
- 文件系统访问
- 设备访问(通过/dev目录访问)
libkern
大部分内核都是完全使用C语言和底层汇编编写的, 而XNU则不同, 设备驱动程序 I/O Kit驱动程序可以用C++语言编写, 为了支持C++运行时并提供所需要的基类, XNU包含libkern库, 这是一个内建的, 自包含的C++库. 没有这个基础很多高级功能都无法实现
I/O Kit
基于libkern而获得的C++环境, 使得I/O Kit驱动程序被极大的简化, 只需要继承于一个已有的驱动程序, 就可以避免样板化代码的复制, 减小代码规模.同时, 使用C++环境而不是用C语言编写使得驱动可以在一个面向对象的环境中工作, 减少了大量代码.
网友评论