Android中 的HAL层简析
@(读书笔记)[HAL层]
HAL(HardWare Abstraction Layer,硬件抽象层)
,在Linux
和Windows
下操作系统下有着不同的实现方式。Windows
下的HAL
位于操作系统的最底层,它直接操作物理硬件设备,使用抽象接口来隔离不同硬件的具体实现,为上层的操作系统和设备驱动程序提供一个统一接口,起到对硬件抽象作用。这样更换硬件时,编写硬件的驱动只要实现符合HAL
定义的标准接口就可以顺利进行硬件更换,而对上层的应用没有影响。Linux
下的HAL
与Windows
不同,HAL
层并不位于操作系统的最底层直接操作硬件,而是在操作系统内核层和驱动程序之上,是一个运行在User Space(用户空间)
的服务程序。
1.HAL结构
要想知道android
中HAL
的结构,我们首先看看来自于HAL0.4.0 Specification
的框架图。
HAL
位于操作系统和驱动程序之上,运行在用户空间中的服务程序。其目的是为上层的应用提供一个统一的查询硬件设备的接口。有了HAL
接口,就可以将硬件开发和上层的应用开发分离开,上层的应用开发不必关系具体实现是什么硬件,同样地,如果硬件厂家需要改变硬件设备,只需要按照HAL
接口的规范和标准提供对应的硬件驱动,而不必更改应用。(HAL
层并不提供对硬件的实际操作,对硬件的实际操作仍然由具体的驱动程序来完成。)
2.Android引入HAL层的原因
HAL
层的优势我们在前面已经提到,这是其中之一,另一个重要的原因就是为了保障在Android
平台基于Linux
开发的硬件驱动和应用程序不必遵循GPL(General Public License)
许可而保持封闭,保证硬件厂家的利益。我们都知道, Linux Kernel
和Android
的许可证不一样,Linux Kernel
遵循的是GPL
许可,Android
遵循的是ASL(Apache SoftWare License)
许可,ASL
许可规定,可以随意使用源码,不必开源,所以建立在Android
之上的硬件驱动和应用程序都可以保持封闭。也就是说,只要把 关键的驱动处理相关的主要逻辑转移到Android
平台内,在Linux Kernel
中国仅保留基础的通信功能,原本应该包括在Linux Kernel
中的某些驱动的关键处理逻辑,被转移到了HAL
层,保证了硬件厂家的利益的同时,也方便了软件的开发。
3.Android中HAL的运行机制。
Android
源码中已经实现了一部分的HAL
,包括Wi-Fi、GPS、RIL、Sensor
等。这些代码主要储存在以下目录:
- Android_src/hardware/libhardware_legacy
:老式的HAL结构,采用直接调用so动态链接库方式。
- android_src/hardware/libhardware
:新式HAL结构,采用Stub代理方式调用。
- Android_src/hardware/ril:RIL
(Radio Interface Layer
,无线通信接口层)。
如上图所示,左图为老式的HAL
结构,应用或者框架通过so动态链接库调用而达到对硬件驱动的访问。在so
动态链接库中,实现了对驱动的访问逻辑处理。右图为新式HAL
结构,该结构采用Proxy
代理模式,Stub
虽然仍是以*.so
的形式存在,但是HAL
已经将*.
的具体实现隐藏了起来。Stub
向HAL
提供operations
方法,Runtime
通过对Stub
提供的so
获取它的operations
方法,并告知Runtime
的callback
方法。这样,Runtime
和Stub
都有对方调用的方法,一个应用的请求通过Runtime
调用Stub
的operations
方法,而Stub
响应operations
方法并完成后,再调用Runtime
的callback
方法进行返回。
上面说的可能太绕,下图为HAL Stub
结构,我们继续来说明HAL
的Stub
结构。
上层通过HAL
提供的functions
来调用底层硬件,而底层硬件处理完成上层请求后或者硬件状态发生变化后,HAL
层通过Runtime
提供的callback
接口回调上层应用。
HAL
里包含了很多的Stub
,Runtime
只要说明请求的类型,就可以取得并操作Stub
对应的operations
。其实现主要在hardware.c
和hardware.h
文件中,实质也是通过dlopen
方法加载.so
动态链接库,从而呼叫*.so
里的符号(symbol
)来实现的。