Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。我们知道,Linux内核源代码版权遵循GNU License,而Android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,在手机市场竞争激烈的今天,这对厂家来说,损害是非常大的。因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。
撇开这些争论,学习Android硬件抽象层,对理解整个Android整个系统,都是极其有用的,因为它从下到上涉及到了Android系统的硬件驱动层、硬件抽象层、运行时库和应用程序框架层等等,下面这个图阐述了硬件抽象层在Android系统中的位置,以及它和其它层的关系:
在学习Android硬件抽象层的过程中,我们将会学习如何在内核空间编写硬件驱动程序、如何在硬件抽象层中添加接口支持访问硬件、如何在系统启动时提供硬件访问服务以及 如何编写JNI使得可以通过Java接口来访问硬件,而作为中间的一个小插曲,我们还将学习一下如何在Android系统中添加一个C可执行程序来访问硬件驱动程序。由于这是一个系统的学习过程,笔者将分成六篇文章来描述每一个学习过程,包括:
二. 在Android系统中增加C可执行程序来访问硬件驱动程序。
三. 在Android硬件抽象层增加接口模块访问硬件驱动程序。
四. 在Android系统中编写JNI方法在应用程序框架层提供Java接口访问硬件。
五. 在Android系统的应用程序框架层增加硬件服务接口。
六. 在Android系统中编写APP通过应用程序框架层访问硬件服务。
来看一个详细的图解,
1)、Linux Kernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
2)、 Libraries和Android Runtime:Libraries:即C/C++函数库部分,大多数都是开放源代码的函数库,例如WebKit,该函数库负责Android网页浏览器的运行,例如标准的C函数库Libc、OpenSSL、SQLite等,当然也包括支持游戏开发2D SGL和3D OpenGL | ES,在多媒体方面有MediaFramework框架来支持各种影音和图形文件的播放与显示,例如MPEG4、H.264、MP3、AAC、AMR、JPG和PNG等众多的多媒体文件格式。Android的Runtime负责解释和执行生成的Dalvik格式的字节码。
3)、Application Framework:(应用软件架构),Java应用程序开发人员主要是使用该层封装好的API进行快速开发。
4)、Applications:该层是Java的应用程序层,Android内置的Google Maps、E-mail、即时通信工具、浏览器、MP3播放器等处于该层,Java开发人员开发的程序也处于该层,而且和内置的应用程序具有平等的位置,可以调用内置的应用程序,也可以替换内置的应用程序。
优点:上面四个层次中,下层给上层服务,上层调用下层的服务,这种严格的分层机制,为Android系统带来很大的灵活性,稳定性和可扩展性。也利于不同层的开发人员专心于该层次的开发任务。
二、以MVC模式来看Android结构
这里还是拿官方的一个图来简单说明一下Android系统中所蕴藏的MVC模式:
MVC的概念相信凡是做过软件的人都会接触到这个理念,即Model、View、Controller三层结构。
1)、模型(Model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
2)、视图(View)对象:是应用程序中负责生成用户界面的部分。也是在整个MVC架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。注意这里只简单负责与用户交互相关的任务。
3)、控制器(Control)对象:是根据用户的输入,控制用户界面数据显示及更新Model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给M哦得了处理。
在Android里MVC模式体现在:
模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。
视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入,(当然,如何你对Android了解的比较的多了话,就一定可以想到在Android中也可以使用JavaScript+HTML等的方式作为View层,当然这里需要进行Java和JavaScript之间的通信,幸运的是,Android提供了它们之间非常方便的通信实现。)
控制层(Controller):Android的控制层的任务主要是由众多的Acitvity的实现,这句话也就暗含了不要在Acitivity中写代码,要通过Activity交给Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉
android 平台大的方面的层次可以划分成三个层次,包括一个操作系统,中间件和应用程序,android 的系统框架图如下:
图中的软件层次自上而下分成4个层次
应用程序(Application)
用用程序框架(Application Framework)
各种类库(Libraries)和android运行时(Adnorid Runtime)
操作系统(OS)
一.应用程序(Application)
应用层是和用户交互的一个层次,用户可以看得见的一些应用,用户可以操作。这类应用基本都是通过Java语言编写的独立的能够完成某些功能的应用程序。Android本身提供了桌面(Home),联系人(Contacts),拨打电话(Phone),浏览器(Browers)等很多基本的应用程序。开发人员可以使用应用框架提供的API编写自己的应用程序,普通开发人员要做的事情就是开应用层的程序提供该广大消费者使用。
二.应用程序框架(Application Framework)
普通开发者可以使用Android基本应用程序使用的系统API,android 应用框架中的各个模块都可以被复用,各种服务也可以被复用,理解了这个机制,开发人员可以更好的更轻松的开发出优秀的android应用。开发过程中常用到的基本框架组件如下:
一组View(UI 组件),这些UI组件包括Button(按钮),EidtView(文本框),TextView(标签),List(列表)等等,灵活运用这些组件可以快速方便的创建良好的用户交互界面。
Content Providers(内容提供者),听起来有点抽象,通俗的理解Content Provider 就是提供一种服务,通过这种服务应用程序之间可以实现数据的互相访问和共享,比如通讯录的存储就使用了这种服务,其它应用也可以访问通讯录中存储的联系人信息。
Resource Manager 顾名思义就是资源管理,android中的资源很多包括图片,用户界面(Layout xml),字体,颜色,UI组件的Id等等都可以称之为资源,这些丰富的资源,都是通过Resource Manager来统一进行管理。
Notification Manager(消息通知管理),它在不影响用户正常操作和使用设备的时候在状态栏上提供消息的提示。比如有短信来的时候,android自动会将这个消息提示在状态栏上,用户可以及时的看到。
Activity Manager(活动管理),Activity管理着应用程序的生命周期,并且控制着应用的导航,扮演控制器的角色。每个Activity类似于Windows应用中的一个wendow。一般的应用都是通过一个个Activity交互构成的。
Window Manager(窗口管理),管理所有启动的窗口。
Location Manager(位置管理),用来管理地图服务的相关功能。
Telephoney Manager(电话管理),用来管理有关的电话的相关功能。
Package Manager(包管理),管理所有的安装在android系统内的应用程序。
三.库(Libraries)和运行环境(RunTime)
这部分内容开始涉及底层,开发普通的应用不会直接对这个层进行操作。这层中包含了一组类库(Libraries)和运行时(RunTime),系统C库(libc),一个从BSD集成来的标准C系统函数库(libc)它是专门为基于嵌入式Linux的设备定制的。
媒体库(Media Framework),基于PackeVideo OpenCore,该库支持多种常用的音频,视频格式以及回放和录制,同时支持静态图像文件。编码格式包括:MPEG4、H.264,MP3、AAC、AMR、JPG、PNG。
Surface Manager 对显示子系统的管理,并且为多个应用提供2D,3D图层的无缝融合。
WebKit,一个最新的web浏览器引擎,用来支持Andiroid浏览器或者嵌入的web视图。
SGL 底层的2D图形引擎。
OPENGL|ES,基于OpenGL ES 1.0 APIs实现,该库可以使用硬件3D加速或者使用高度优化的3D软加速。
FreeType,位图(bitmap)和适量(vector)字图显示支持。
SQLite,一个对所有应用程序可用,功能强大的轻量级关系型数据库引擎。
Core Libraries 该核心库提供了Java编程语言核心库的大多数功能。
Dalvik VM, android平台的一个虚拟机,它相当于PC中Java的虚拟机JVM。
四、操作系统(OS)
Android 的核心系统服务依赖于Linux 2.6 内核,操作系统为Android提供的服务包括:
安全性(Security)。
内存管理(Memory Management)
进程管理(Process Management)
网络堆栈(Network Stack)
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/app/5989.html