ch8.1 Android HAL层简介

来源:互联网 发布:好玩的rpg游戏 知乎 编辑:程序博客网 时间:2024/06/04 19:15
8.1 Android HAL层简介

HAL(Hardware abstract Layer)硬件抽象层是google开发的android系统里上层应用对底层硬件操作的一个屏蔽的软件层次,通俗来讲,就是上层的应用不用关心底层硬件如何工作,只要向上层提供一个统一的接口即可,这种设计思想广泛存在于当前的软件架构设计里。

学习目标:
1.了解android HAL
2.熟悉android HAL Module架构
3.熟悉android HAL stub 代理架构
4.掌握Android LED HAL代码编写方法

严格来讲,android系统完全可以没有hal层,上层应用层可以直接通过api和jni技术访问底层硬件,但是android自出现开始一直打着开源的旗号,而一些硬件厂商由于商业因数,不希望自己核心的代码开源出来,而只是提供二进制代码。 另外android系统里使用了一些硬件设备接口可能支持linux kernel driver的统一接口,并且linux内核中使用的相当严格的GPL版本,所有内核代码必须开源,google为了让自己的android系统泡在更多硬件设备上并支持更多设备类型,在android的架构里提出了HAL概念。
HAl其实就是硬件设备抽象的意思,android系统的功能不依赖于某一个具体的硬件驱动,而是依赖于HAL代码,相当于将linux设备驱动分为两部分 ,一部分在kernel中使用GPL协议开源一些非核心的接口访问的代码,另外一部分在kernel上的应用层使用apache协议,主要是硬件厂商不希望开源的逻辑代码,仅提供二进制代码。

android & framework
|
HAL :device operation logic
|
linux kernel: device interface driver

8.1.1 HAL存在原因
HAL有两种架构
1.Module架构
2.stub代理架构
module架构是2008年以前使用的旧架构,HAL代码被编译成动态模块库,andorid应用程勋和框架层通过jni加载并调用HAL Module 库代码,在HAL Module库中在去访问设备驱动。
app & framework
|
Device Module HAL *.so
|
Linux Device Driver
旧的架构比较好理解 ,android用户应用程序或者框架层代码有java实现,java运行在dalvik虚拟机中,没有办法直接访问底层硬件,只能通过调用so本地库代码,在so本地库代码里面有对底层硬件的操作代码。
也就是说,应用层或框架层java代码,通过jni技术调用c或c++写的so库代码,在so库代码中调用底层驱动,实现上层应用的提出的一个脚请求操作。实现硬件操作的so库为module。
该方式对硬件访问效率比起C代码低,只能够达到c语言95%左右。
因此谷歌有提出了新的HAL架构。在这个设计架构虽然满足了java应用访问硬件的需求,但是使得代码上下层耦合度太高,用户程序或framework代码必须去加载module库,如果底层硬件有变化,module要重新编译,上层也要做相应的变化。另外如果多个应用程序同时访问硬件,都去加载Module,同一个Module被多个进程映射多次,会有代码重入问题。

8.1.3 新的HAL架构
新的架构使用的是Module stub方式。stub是存根或桩的意思,其实就是一个对象代表的意思。
由上面的架构可知,上层应用层或framework层加载so库代码,so库代码称为module,在HAL层注册了每个硬件对象的存根stub,当上层需要访问硬件的时候,就从当前注册应急对象stub里查找,找到之后stub会向上层module提供改硬件对象operations interface 操作接口,该操作接口就保存在module中,上层应用或框架在通过这个Module中的操作接口来访问硬件。