合众为一 OS X 和 iOS的架构

2019-04-15  本文已影响0人  TAsama

iOS实际上是完整OS X精简之后的版本, 和OS X有两大主要区别:

2.1 OS X 架构概述
OS X & iOS层次结构
用户体验层
应用框架层
核心框架层
Darwin

Drawin架构


实际上是Mach 和 BSD两种技术的混合

OS X特有的文件目录

iOS文件系统

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/目录下压缩了应用程序的目录内容.

解压后ipa包中的内容
Payload目录下的压缩应用程序目录
真机上拷贝出来的app文件夹
Info.plist
Info.plist文件位于应用程序(以及其他大部分bundle)的Contents/子目录下, 这个文件保存了bundle的元数据信息. 这个文件是必备的, 操作系统通过这个文件判定了依赖关系和其他属性.

一个标准的Info.plist文件包含以下条目

以上所有的键都是以CF开头的, 表示这些键都是Core Foundation框架定义并处理的. Cocoa应用程序还包含NS开头的键, 定义了应用程序是否允许脚本操作 Java需求, 以及和系统偏好设置应用程序面板的综合能力, 大部分的NS开头的键只能适用于OS X 而不能用于 iOS


钉钉的Info.plist文件结构

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文件可以用于判断一个应用程序是否完好无损,能够防止不小心修改或损坏资源文件.


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以及其他很多库.

其他应用程序类型

  1. Java(仅限于OS X)
    OS X包含一个和Java 1.6完整兼容的Java虚拟机
  2. Widget
  3. BSD/Mach原生程序
    可以使用C/C++语言编写原生应用程序

XNU概述

内核XNU是Darwin的核心, 也是整个OS X的核心, XNU本身由以下几个组件构成

Mach

XNU的核心, "原子核", 可以认为就是Mach, 这个微内核仅能处理操作系统最基本的职责:

Mach本身的API非常有限, 而且本身也不是设计为一个具有全套功能的操作系统, 苹果不鼓励使用Mach的API, 不过可以看出来, 这些API非常基础, 如果没有这些API的话, 其他工作都无法实施. 任何额外的功能, 例如文件和设备访问, 都必须在此基础上实现, 而这些额外的功能都是BSD层实现的.

BSD层

BSD层建立在Mach之上, 也是XNU中一个不可分割的部分.

libkern

大部分内核都是完全使用C语言和底层汇编编写的, 而XNU则不同, 设备驱动程序 I/O Kit驱动程序可以用C++语言编写, 为了支持C++运行时并提供所需要的基类, XNU包含libkern库, 这是一个内建的, 自包含的C++库. 没有这个基础很多高级功能都无法实现

I/O Kit

基于libkern而获得的C++环境, 使得I/O Kit驱动程序被极大的简化, 只需要继承于一个已有的驱动程序, 就可以避免样板化代码的复制, 减小代码规模.同时, 使用C++环境而不是用C语言编写使得驱动可以在一个面向对象的环境中工作, 减少了大量代码.

上一篇 下一篇

猜你喜欢

热点阅读