美文网首页
合众为一 OS X 和 iOS的架构

合众为一 OS X 和 iOS的架构

作者: TAsama | 来源:发表于2019-04-15 16:43 被阅读0次

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

    解压后ipa包中的内容
    Payload目录下的压缩应用程序目录
    真机上拷贝出来的app文件夹
    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


    钉钉的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微内核
    • 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语言编写使得驱动可以在一个面向对象的环境中工作, 减少了大量代码.

    相关文章

      网友评论

          本文标题:合众为一 OS X 和 iOS的架构

          本文链接:https://www.haomeiwen.com/subject/hbrxwqtx.html