【IOS开发进阶系列】iOS系统架构专题

2023-10-16 11:36:41 浏览数 (1)

1 IOS系统架构

1.1 IOS系统架构

1.1.1 iOS的系统架构

        iOS的系统架构分为四个层次:核心操作系统层(CoreOS layer)、核心服务层(Core Services layer)、媒体层(Medialayer)和可触摸层(Cocoa Touch layer)。图1-1展示了Mac OS X和iOS系统架构层次的一个对比。

        从上图中我们可以发现Mac OS X与iOS的系统架构层次只有最上面一层不同,由Cocoa框架换成了Cocoa Touch,因此开发iOS应用程序与开发Mac OS X程序是相似的,现在就让我们来具体看看每层所包含的内容。

        要比其他操作系统的产品好很多。

        位于iOS系统架构最下面的一层是核心操作系统层,它包括内存管理、文件系统、电源管理以及一些其他的操作系统任务。它可以直接和硬件设备进行交互。核心操作系统层包括以下这些组件:

OS X Kernel            Mach 3.0                BSD

SocketsPower         Mgmt                      File System

Keychain                Certificates              Security

Bonjour

        第二层是核心服务层,我们可以通过它来访问iOS的一些服务。它包括以下这些组件:

Collections                Address Book       Networking

File Access                SQLite                Core Location

Net Services                Threading          Preferences

URLUtilities

        第三层是媒体层,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。它包括以下这些组件:

Core Audio                 OpenGL                    Audio Mixing

Audio Recording        Video Playback       JPG,PNG,TIFF

PDF                            Quartz                    Core Animation

OpenGL ES

        最上面一层是可触摸层,这一层为我们的应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作。它包括以下这些组件:

Multi-TouchEvents         CoreMotion           Camera

ViewHierarchy               Localization            Alerts

Web Views                    Image Picker            Multi-Touch Controls

        在Cocoa Touch层中的很多技术都是基于Objective-C语言的。Objective-C语言为iOS提供了像集合、文件管理、网络操作等支持。像UIKit框架,它为应用程序提供了各种可视化组件,比如像窗口(Window)、视图(View)和按钮组件(UIButton)。Cocoa Touch层中的其他框架,对我们在应用程序中的开发来说也是非常有用的,如访问用户通信录功能框架、获取照片信息功能的框架、负责加速感应器和三维陀螺仪等硬件支持的框架。

1.1.2  Android与ios系统架构对比

        Android系统架构为四层结构,从上层到下层分别是应用程序层、应用程序框架层、系统运行库层以及Linux内核层,见图2.1分别介绍如下:

1)应用程序层

        Android平台不仅仅是操作系统,也包含了许多应用程序,诸如SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等应用程序。这些应用程序都是用Java语言编写的,并且这些应用程序都是可以被开发人员开发的其他应用程序所替换,这点不同于其他手机操作系统固化在系统内部的系统软件,更加灵活和个性化。

2)应用程序框架层

       应用程序框架层是我们从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的,该层简化了组件的重用,开发人员可以直接使用其提供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。

a) Activity Manager(活动管理器)

       管理各个应用程序生命周期以及通常的导航回退功能

 b) Window Manager(窗口管理器)

       管理所有的窗口程序

  c)  Content Provider(内容提供器)

       使得不同应用程序之间存取或者分享数据

  d) View System(视图系统)

       构建应用程序的基本组件

  e) Notification Manager(通告管理器)

       使得应用程序可以在状态栏中显示自定义的提示信息

  f) Package Manager(包管理器)

       Android系统内的程序管理

 g)Telephony Manager(电话管理器)

       管理所有的移动设备功能

  h)Resource Manager(资源管理器)

       提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等

  i)Location Manager(位置管理器)

       提供位置服务

  j)XMPP Service(XMPP服务)

       提供Google Talk服务

3)系统运行库层

     从图中可以看出,系统运行库层可以分成两部分,分别是系统库和Android运行时,分别介绍如下:

a)系统库

      系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带。其主要分为如下几个:

Surface Manager:

      执行多个应用程序时候,负责管理显示与存取操作间的互动,另外也负责2D绘图与3D绘图进行显示合成。

Media Framework:

      多媒体库,基于PacketVideo OpenCore;支持多种常用的音频、视频格式录制和回放,编码格式包括MPEG4、MP3、H.264、AAC、ARM。

SQLite:

      小型的关系型数据库引擎

OpenGL|ES:

      根据OpenGL ES 1.0API标准实现的3D绘图函数库

 FreeType:

      提供点阵字与向量字的描绘与显示

WebKit:

      一套网页浏览器的软件引擎

SGL:

      底层的2D图形渲染引擎

 SSL:

     在Andorid上通信过程中实现握手

 Libc:

       从BSD继承来的标准C系统函数库,专门为基于embedded linux的设备定制

 b)Android运行时

      Android应用程序时采用Java语言编写,程序在Android运行时中执行,其运行时分为核心库和Dalvik虚拟机两部分。

核心库:

      核心库提供了Java语言API中的大多数功能,同时也包含了Android的一些核心API,如android.os、android.net、android.media等等。

Dalvik虚拟机:

      Android程序不同于J2me程序,每个Android应用程序都有一个专有的进程,并且不是多个程序运行在一个虚拟机中,而是每个Android程序都有一个Dalivik虚拟机的实例,并在该实例中执行。Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。需要注意的是,Android程序在虚拟机中执行的并非编译后的字节码,而是通过转换工具dx将Java字节码转成dex格式的中间码。

  4)Linux内核层

      Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。

Android内核分析

        一、内核在操作系统中的地位Android基于Linux操作系统由硬件、系统内核、系统服务和应用程序等四大部分组成。其中内核是核心的部分,其主要作用在于与计算机硬件进行交互实现对硬件的编程控制和接口操作调度访问硬件资源同时向应用程序提供一个高级的执行环境和对硬件的虚拟接口。主要功能包括中断服务程序、进程调度程序、进程地址空间的内存管理、进程间通信。内核与普通应用程序不同,其拥有所有硬件设备的访问权限以及启动时即划分的受保护的内存空间。

        二、Android内核和标准的Linux内核一样,Android内核主要实现内存管理、进程调度、进程间通信等功能。Android内核是在标准Linux内核的基础上修改而成。为了适应嵌入式硬件环境和移动应用程序的开发Android对标准Linux内核进行了一定的修改。经过与标准Linux内核源代码进行详细对比可以发现Android内核与标准Linux内核在文件系统、进程间通信机制、内存管理等方面存在不同。

        文件系统不同于桌面系统与服务器移动设备大多采用的不是硬盘而是采用Flash作为存储介质,因此Android内核中增加了标准Linux内核中没有采纳的YAFFS2文件系统。YAFFS2按层次结构设计分为文件管理接口、内部实现层和NAND简化了其本身与系统的接口设计能更方便地集成到系统当中。

        进程间通信机制Android增加了一种进程间的通信机制IPCBinder,Binder通过守护进程ServiceManager管理系统中的服务,负责进程间的数据交换。各进程通过Binder访问同一块共享内存以达到数据通信的机制。从应用层的角度看进程通过访问数据守护进程获取用于数据交换的程序框架接口,调用并通过接口共享数据,而其他进程要访问数据也只需与程序框架接口进行交互方便了程序员开发需要交互数据的应用程序。

        内存管理在内存管理模块Android内核采用了一种不用于标准Linux内核的低内存管理策略。在标准Linux内核当中使用一种叫做OOM(OutofMemory)的低内存管理策略,当内存不足时系统检查所有的进程并对进程进行限制评分获得最高分的进程将被关闭。Android新增加了一种内存共享的处理方式Ashmem。通过Ashmem进程间可以匿名自由共享具名的内存块这种共享方式在标准Linux当中不被支持。经过分析Android内核由标准Linux内核修改而来,因此继承了Linux内核的各种优点保留了标准Linux内核的主体架构。同时Android按照移动设备的需求在文件系统、内存管理、进程间通信机制、电源管理等方面进行了修改添加相关的驱动程序和一些必要的新功能,但是与大多数精简的嵌入式Linux操作系统相比Android很大程度上保留了标准Linux的基本架构,因此Android系统应用范围更加广泛拓展性更强。

1.2 其他分层图

1.3 IOS分层说明

1.3.1 CocoaTouch层

        Cocoa Touch是iPhone OS架构中最重要层之一。它包括开发iPhone应用的关键框架,当开发iPhone应用时,开发者总是从这些框架开始,然后向下追溯到需要的较低层框架 。

        Cocoa Touch层包括UIKit框架,基础框架(Foundation Framework)和电话本UI框架(AddressBookUI Framework)。

1.3.1.1 UIKit框架

        UIKit框架(UIKit.framework)包含Objective-C程序接口,提供实现图形,事件驱动的iPhone应用的关键架构。iPhoneOS中的每一个应用采用这个框架实现如下核心功能:

 应用管理;

 支持图形和窗口;

 支持触摸事件处理;

 用户接口管理;

提供用来表征标准系统视图和控件的对象;

支持文本和Web内容;

通过URL scheme与其他应用的集成。

        为提供基础性代码建立应用,UIKit也支持一些与设备相关的特殊功能,如下所示:

加速计数据;

内建Camera;

用户图片库;

设备名称和模式信息。

1.3.1.2 基础框架(Foundation Framework)

        基础框架(Foundation.framework)支持如下功能:

Collection数据类型(包括Arrays、Sets);

Bundles;

字符串管理;

日期和时间管理;

原始数据块管理;

首选项管理;

线程和循环;

URL和Stream处理;

Bonjour;

通信端口管理;

国际化。

1.3.1.3 电话本UI框架(AddressBook UIFramework)

电话本UI框架(AddressBookUI.framework)是一个Objective-C标准程序接口,主要用来创建新联系人,编辑和选择电话本中存在的联系人。它简化了在iPhone应用中显示联系人信息,并确保所有应用使用相同的程序接口,保证应用在不同平台的一致性。

1.3.2 媒体层(Media layer)

媒体层包括图像、音频和视频技术,采用这些技术在手机上创建最好的多媒体体验。更重要的是,应用这些技术开发的应用将有更好的视听效果。利用iPhone OS高层框架可以快速地创建先进的图像和动画。媒体层包括图像技术(Graphics Technologies,包括 Quartz、CoreAnimation 和 OpenGL ES),音频技术(Audio Technologies,包括 Core Audio 和 OpenAL)和视频技术(Video Technologies)。

1.3.2.1 图像技术(GraphicsTechnologies)

        高质量图像是所有iPhone应用的一个重要的组成部分。任何时候,开发者可以采用UIKit框架中已有的视图和功能以及预定义的图像来开发iPhone应用。然而,当UIKit框架中的视图和功能不能满足需求时,开发者可以应用下面描述的技术和方法来制作视图。

①  Quartz。

        核心图像框架(CoreGraphics.framework)包含了Quartz 2D画图API,Quartz与在Mac OS中采用的矢量图画引擎是一样先进的。Quartz支持基于路径(Path-based)画图、抗混淆(Anti-aliased)重载、梯度(Gradients)、图像(Images)、颜色(Colors)、坐标空间转换(Coordinate-spaceTransformations)、pdf文档创建、显示和解析。

        虽然API是基于C语言的,它采用基于对象的抽象表征基础画图对象,使得图像内容易于保存和复用。

②  核心动画(CoreAnimation)。

        Quartz核心框架(QuartzCore.framework)包含CoreAnimation接口,CoreAnimation是一种高级动画和合成技术,它用优化的重载路径(RenderingPath)实现复杂的动画和虚拟效果。它用一种高层的Objective-C接口配置动画和效果,然后重载在硬件上获得较好的性能。CoreAnimation集成到iPhone OS的许多部分,包括UIKit类如UIView,提供许多标准系统行为的动画。开发者也能利用这个框架中的Objective-C接口创建客户化的动画。

③  OpenGL ES。

        OpenGLES框架(OpenGLES.framework)符合OpenGL ES v1.1规范,它提供了一种绘画2D和3D内容的工具。OpenGLES框架是基于C语言的框架,与硬件设备紧密相关,为全屏游戏类应用提供高帧率(highframe rates)。

        开发者总是要使用OpenGL框架的EAGL接口,EAGL接口是OpenGL ES框架的一部分,它提供了应用的OpenGL ES画图代码和本地窗口对象的接口。

1.3.2.2 音频技术(AudioTechnologies)

        iPhone OS的音频技术为用户提供了丰富的音频体验。它包括音频回放,高质量的录音和触发设备的振动功能等。

        iPhone OS的音频技术支持如下音频格式:AAC、AppleLossless(ALAC)、A-law、IMA/ADPCM(IMA4)、LinearPCM、μ-law和CoreAudio等。

① 核心音频(CoreAudioFamily)。

        核心音频框架家族(Core Audio family offrameworks)提供了音频的本地支持,如表16-1所示。CoreAudio是一个基于C语言的接口,并支持立体声(StereoAudio)。开发能采用iPhone OS的CoreAudio框架在iPhone应用中产生、录制、混合和播放音频。开发者也能通过核心音频访问手机设备的振动功能。

        CoreAudio.framework定义核心音频的音频数据类型

        AudioUnit.framework提供音频和流媒体文件的回放和录制,并且管理音频文件和播放提示声音

        AudioToolbox.framework提供使用内置音频单元服务,音频处理模块

② OpenAL。

        iPhoneOS也支持开放音频库(OpenAudio Library,OpenAL)。OpenAL是一个跨平台的标准,它能传递位置音频(PositionalAudio)。开发者能应用OpenAL在需要位置音频输出的游戏或其他应用中实现高性能、高质量的音频。

        由于OpenAL是一个跨平台的标准,采用OpenAL的代码模块可以平滑地移植到其他平台。

1.3.2.3 视频技术(VideoTechnologies)

        iPhone OS通过媒体播放框架(MediaPlayer.framework)支持全屏视频回放。媒体播放框架支持的视频文件格式包括.mov,.mp4,.m4v和.3gp,并应用如下压缩标准:

①H.264 Baseline Profile Level 3.0 video,在30 f/s的情况下分辨率达到640×480像素。注意:不支持B frames;

②MPEG4规范的视频部分;

③ 众多的音频格式,包含在音频技术的列表里,如AAC、AppleLossless(ALAC)、A-law、IMA/ADPCM(IMA4)、线性PCM、μ-law和CoreAudio等。

1.3.3  核心服务层(CoreServicesLayer)

        核心服务层为所有应用提供基础系统服务,即使不直接使用这些服务,也应该了解内置在该系统中的技术。

1.3.3.1 电话本

        电话本框架(AddressBook.framework)提供了保存在手机设备中的电话本编程接口。开发者能使用该框架访问和修改存储在用户联系人数据库里的记录。例如,一个聊天程序可以使用该框架获得可能的联系人列表,启动聊天的进程(Process),并在视图上显示这些联系人信息等。

1.3.3.2 核心基础框架

        核心基础框架(CoreFoundation.framework)是基于C语言的接口集,提供iPhone应用的基本数据管理和服务功能。该框架支持如下功能:

Collection数据类型(Arrays、Sets等);

Bundles;

字符串管理;

日期和时间管理;

原始数据块管理;

首选项管理;

URL和Stream操作;

线程和运行循环(RunLoops);

端口和Socket通信。

        核心基础框架与基础框架是紧密相关的,它们为相同的基本功能提供了Objective-C接口。如果开发者混合使用Foundation Objects和Core Foundation类型,就能充分利用存在两个框架中的"toll-freebridging"。toll-freebridging意味着开发者能使用这两个框架中的任何一个的核心基础和基础类型,例如Collection和字符串类型等。每个框架中的类和数据类型的描述注明该对象是否支持toll-free bridged。如果是,它与哪个对象桥接(toll-freebridged)。

1.3.3.3 CFNetwork

        CFNetwork框架(CFNetwork.framework)是一组高性能的C语言接口集,提供网络协议的面向对象的抽象。开发者可以使用CFNetwork框架操作协议栈,并且可以访问低层的结构如BSD Sockets等。同时,开发者也能简化与FTP和HTTP服务器的通信,或解析DNS等任务。使用CFNetwork框架实现的任务如下所示:

BSD Sockets;

利用SSL或TLS创建加密连接;

解析DNS Hosts;

解析HTTP协议,鉴别HTTP和HTTPS服务器;

在FTP服务器工作;

发布、解析和浏览Bonjour服务。

1.3.3.4 核心位置框架(CoreLocation Framework)

        核心位置框架(CoreLocation.framework)主要获得手机设备当前的经纬度,核心位置框架利用附近的GPS、蜂窝基站或Wi-Fi信号信息测量用户的当前位置。iPhone地图应用使用这个功能在地图上显示用户的当前位置。开发者能融合这个技术到自己的应用中,给用户提供一些位置信息服务。例如可以提供一个服务:基于用户的当前位置,查找附近的餐馆、商店或设备等。

1.3.3.5 安全框架(SecurityFramework)

        iPhoneOS除了内置的安全特性外,还提供了外部安全框架(Security.framework),从而确保应用数据的安全性。该框架提供了管理证书、公钥/私钥对和信任策略等的接口。它支持产生加密安全的伪随机数,也支持保存在密钥链的证书和密钥。对于用户敏感的数据,它是安全的知识库(SecureRepository)。

        CommonCrypto接口也支持对称加密、HMAC和数据摘要。在iPhoneOS里没有OpenSSL库,但是数据摘要提供的功能在本质上与OpenSSL库提供的功能是一致的。

1.3.3.6 SQLite

        iPhone应用中可以嵌入一个小型SQL数据库 SQLite,而不需要在远端运行另一个数据库服务器。开发者可以创建本地数据库文件,并管理这些文件中的表格和记录。数据库SQLite为通用的目的而设计,但仍可以优化为快速访问数据库记录。访问数据库SQLite的头文件位于/usr/include/sqlite3.h,其中是SDK安装的目标路径。

1.3.3.7 支持XML

        基础框架提供NSXMLParser类,解析XML文档元素。libXML2库提供操作XML内容的功能,这个开放源代码的库可以快速解析和编辑XML数据,并且转换XML内容到HTML。访问libXML2库的头文件位于目录/usr/include/libxml2/,其中是SDK安装的目标目录。

1.3.4  核心OS层(Core OS Layer)

        核心OS层包含操作系统的内核环境、驱动和基本接口。内核基于Mac操作系统,负责操作系统的各个方面。它管理虚拟内存系统、线程、文件系统、网络和内部通信。核心OS层的驱动也提供了硬件和系统框架之间的接口。然而,由于安全的考虑,只有有限的系统框架类能访问内核和驱动。

        iPhoneOS提供了许多访问操作系统低层功能的接口集,iPhone应用通过LibSystem库来访问这些功能,这些接口集如下所示:

线程(POSIX线程);

网络(BSDsockets);

文件系统访问;

标准I/O;

Bonjour和DNS服务;

现场信息(LocaleInformation);

内存分配;

数学计算。

        许多Core OS技术的头文件位于目录/usr/include/,iPhoneSDK是SDK的安装目录。

1.3.5  Framework--应用程序框架

        什么是框架?本质上来说它是帮助我们完成各种特定功能的软件库。

        我们编写的应用程序项目,都是从Cocoa Touch层开始的,具体来说就是从UIKitFramework开始的。当在编写程序的过程中需要用到一些特殊功能的时候,我们应该从框架的最顶端技术开始寻找相应的框架,只有在上层结构无法解决时,才能使用其下层的技术。其实,顶层的框架已经涵盖了我们绝大多数需要的功能。

AddressBook.framework:提供访问存储核心数据库中用户联系人信息的功能

AddressBookUI.framework:提供一个用户界面,用于显示存储在地址簿中的联系人信息

AudioToolbox.framework:提供音频录制和回放的底层API,同时也负责管理音频硬件

AudioUnit.framework:提供一个接口,让我们的应用程序可以对音频进行处理

AVFoundation.framework:提供音频录制和回放的底层API,同时也负责管理音频硬件

CFNetwork.framework:访问和配置网络,像HTTP、FTP和Bonjour  Services

CoreFoundation.framework:提供抽象的常用数据类型,如Unicode strings、XML、URL等

CoreGraphics.framework:提供2D绘制的基于C的API

CoreLocation.framework:使用GPS和Wi-Fi获取位置信息

Foundation.framework:提供Object-C的基础类(像NSObject)、基本数据类型和操作系统服务等

GameKit.framework:为游戏提供网络功能;点对点互联和游戏中的语音交流

MapKit.framework:为应用程序提供内嵌地图的接口

MediaPlayer.framework:提供播放视频和音频的功能

MessageUI.framework:提供视图控制接口用以处理E-mail和短信

OpenGLES.framework:提供简洁而高效的绘制2D和3D图形的OpenGL API子集

QuartzCore.framework:提供动画特效以及通过硬件进行渲染的能力

StoreKit.framework:为应用程序提供在程序运行中消费的支持

SystemConfiguration.framework:检测当前网络是否可用和硬件设备状态的能力

UIKit.framework:创建和管理应用程序的用户界面

2 iPhone SDK中的各种工具

        iOS SDK中提供了一整套开发工具来帮助我们进行iPhone、iPod Touch和iPad应用程序的开发。在这些工具包括:

Xcode -集成开发环境(IDE),通过它对项目进行管理、编辑和调试;

Interface Builder -可视化的用户界面编辑器,帮助我们快速设计和创建用户界面;

iPhone Simulator -在Mac上面用于模拟iPhone或者iPad的模拟器程序;

Instruments -分析工具,帮助我们提高程序的运行效率和监控内存溢出等情况;

Dashcode -另一个集成开发环境,通过它开发基于Web的应用程序。

3 Cocoa中MVC架构

3.1 Controller层架构设计

        Controller层总职责是:负责视图控件的内存分配与业务数据填充,而业务数据准备尽量放在业务处理层,一般是Model准备层;

3.1.1 视图初始化逻辑代码编写

编写原则:

    1、遵循视图加载生命周期来进行视图初始化与数据填充;

    2、控件内存分配与显示数据填充相分离;

    3、控件初始化工作尽量写在Controller的init或者ViewdidLoad方法中;

    4、控件显示数据填充逻辑尽量写在ViewWillAppear方法中;

5 参考链接

架构设计的十个学习步骤(上集)

http://www.osforce.cn/openclass/136/show

架构设计的十个学习步骤(下)

http://www.osforce.cn/course/323

0 人点赞