浅谈安卓平台的技术架构

浅谈安卓平台的技术架构

官方公布的标准架构如图所示:
这里写图片描述
由图可以看出,Android平台采用了软件堆层(又名软件叠层)的架构,主要分为四部分:底层(Linux核心层)以Linux核心为基础,并包含各种驱动,只提供基本功能;中间层(系统运行库层)包括程序库和安卓运行时环境;再往上一层(应用程序框架层)是Android提供的应用程序框架;最上层(应用程序层)是各种应用软件,包括通话程序、短信程序等,这些应用软件由开发人员自行开发。

1.Linux 内核层

Android以Linux操作系统内核为基础,借助Linux内核服务实现硬件设备驱动、进程和内存管理、网络协议栈、电源管理、无线通信等核心功能。
Android4.0版本之前基于Linux2.6系列内核,4.0及之后的版本使用更新的Linux3.X内核,并且两个开源项目开始有了互通。Linux3.3内核中正式包括一些Android代码,可以直接引导进入Android。Linux3.4增添了电源管理等更多功能,以增加与Android的硬件兼容性,使Android在更多设备上得到支持。
Android内核对Linux内核进行了增强,增加了一些面向移动计算的特有功能。例如,低内存管理器LMK(Low Memory Keller),匿名共享内存(Ashmem),以及轻量级的进程间通信Binder机制等。这些内核的增强使Android在继承Linux内核安全机制的同时,进一步提升了内存管理,进程间通信等方面的安全性。Android和Linux内核中一些典型的不同可以列举如下:

名称不同
文件系统不同于桌面系统与服务器采用硬盘作为存储介质,移动设备大多采用Flash作为存储介质,因此,Android内核中增加了标准Linux内核中没有采纳的YAFFS2文件系统。YAFFS2按层次结构设计,分为文件管理接口、内部实现层和NAND,简化了其本身与系统的接口设计,能更方便地集成到系统当中。
进程间通信机制Android增加了一种进程间的通信机制IPCBinder,Binder通过守护进程ServiceManager管理系统中的服务,负责进程间的数据交换。各进程通过Binder访问同一块共享内存,以达到数据通信的机制。从应用层的角度看,进程通过访问数据守护进程获取用于数据交换的程序框架接口,调用并通过接口共享数据,而其他进程要访问数据,也只需与程序框架接口进行交互,方便了程序员开发需要交互数据的应用程序。
内存管理在内存管理模块,Android内核采用了一种不用于标准Linux内核的低内存管理策略。在标准Linux内核当中,使用一种叫做OOM(OutofMemory)的低内存管理策略;当内存不足时,系统检查所有的进程,并对进程进行限制评分,获得最高分的进程将被关闭。Android新增加了一种内存共享的处理方式Ashmem。通过Ashmem,进程间可以匿名自由共享具名的内存块,这种共享方式在标准Linux当中不被支持。

Linux 内核层也同时作为硬件和软件栈之间的抽象层。有的架构图也将这个抽象部分单独提取出来,作为HAL层。
这里写图片描述
HAL层是硬件厂商设备层,主要是为了不共享代码,保护驱动源码,只提供二进制代码。其完成了对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。
那么,为什么不把硬件抽象层和内核驱动整合在一起放在内核空间中呢?
从技术实现的角度来看,整合在一起放在内核空间中是可以的。然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。Linux内核源代码版权遵循GNU License(发布产品时必须公布源代码),而Android源代码版权遵循Apache License(发布产品时无需公布源代码),如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,就意味着把硬件的相关参数和实现都公开了,这会对厂家造成非常大的经济利益损害。
因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。

2.系统运行库层
1)程序库

Android 包含一些C/C++库,这些库包括九个子系统,它们能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是这些核心库的具体介绍:

核心库介绍
系统C库一个从BSD继承来的标准C系统函数库(libc), 它是专门为基于embedded linux的设备定制的。 注:这里所说的libc并不像平时的linux下的glibc,而是由android自己开发的一个llibc,称为bionic,大小只有200多k,运行速率明显比glibc实现的快得多。
媒体库基于 PacketVideo OpenCORE,该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
Surface Manager对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。
LibWebCore一个最新的web浏览器引擎,支持Android浏览器和一个可嵌入的web视图。
SGL底层的2D图形引擎。
3D libraries基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。
FreeType位图(bitmap)和矢量(vector)字体显示。
SQLite一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。Android提供了一些新的SQLite数据库API,以替代传统的耗费资源的JDBC API。
SSL安全套接层,是为网络通信提供安全及数据完整性的一种安全协议。

除上述的主要系统类库之外,Android NDK(Native Development Kit),即Android原生库,也十分重要。NDK为开发者提供了直接使用Android系统资源,并采用C或C++语言编写程序的接口。因此,第三方应用程序可以不依赖于Dalvik虚拟机进行开发。实际上,NDK提供了一系列从C或C++生成原生代码所需要的工具,为开发者快速开发C或C++的动态库提供方便,并能自动将生成的动态库和Java应用程序一起打包成应用程序包文件,即.apk文件。
然而,使用原生库无法访问应用框架层API,兼容性可能无法保障。而且从安全性角度考虑,Android原生库用非类型安全的程序语言C/C++编写,更容易产生安全漏洞,原生库的缺陷(bug)也可能更容易直接影响应用程序的安全性。

2)Android 运行库

Android 包括了一个核心库,该核心库既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如android.os、android.NET、android.media等等。
一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik虚拟机是基于apache的java虚拟机,并被改进以适应低内存,低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,比如线程机制和底层内存管理机制。主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。
Dalvik虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的 “dx” 工具转化成.dex格式,由虚拟机执行。

本质而言,Dalvik虚拟机并非传统意义上的java虚拟机(JVM)。Dalvik虚拟机不仅不按照Java虚拟机的规范来实现,而且两者不兼容。Dalvik和标准Java虚拟机有以下主要区别:
①Dalvik基于寄存器,而JVM基于栈。一般认为,基于寄存器的实现虽然更多依赖于具体的CPU结构,硬件通用性稍差,但其使用等长指令,在效率速度上较传统JVM更有优势。
②Dalvik经过优化,允许在有限的内存中同时高效地运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行,都拥有一个独立的Dalvik虚拟机实例。Android这种基于Linux的进程“沙箱”机制,是整个安全设计的基础之一。
Dalvik虚拟机从DEX(Dalvik Executable)格式的文件中读取指令与数据,进行解释运行。DEX文件由传统的编译产生的CLASS文件,经dx工具软件处理后生成。
③Dalvik的DEX文件还可以进一步优化,提高运行性能。通常,OEM的应用程序可以在系统编译后,直接生成优化文件(.ODEX):第三方的应用程序则可在运行时在缓存中优化与保存,优化后的格式为DEY(.dey文件)。
这部分内容,即从android4.4开始就出现了ART(android runtime),但是这个ART并不是指这一节的主题,而是一种用来代替Dalvik的新型运行环境。当然在4.4的正式环境中用的还是Dalvik,真正开始用ART取代Dalvik是从android5.0开始的。

3.应用程序框架层

该层是Android应用开发的基础,开发人员大部分情况是在和它打交道。应用程序框架层的设计简化了组件的重用;任何一个应用程序都可以发布它的功能块,并且任何其它的应用程序都可以使用其所发布的功能块(不过需要遵循框架的安全性限制)。基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件。隐藏在每个应用后面的是一系列的服务和系统,包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。

4.应用程序层

Android会同一系列核心应用程序包一起发布,该应用程序包包括Email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。

总结

本文对android的基本架构进行了一个总体的分析和罗列,我们可以看出,Android的系统架构采用分层架构的思想,架构清晰,层次分明,协同工作。同时也给我们的学习与实践指明了方向。不同方向的开发人员应该着眼于不同的层,在该方向上求精。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值