1. HAL介绍
Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚。思路是把控制硬件的动作都放到了Android HAL中,而linux driver仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到user space。而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码,所以说Android只是一个开放的平台,并不是一个开源的平台。
总结下来,Android HAL存在的原因主要有:
- 并不是所有的硬件设备都有标准的linux kernel的接口
- KERNEL DRIVER涉及到GPL的版权。某些设备制造商并不原因公开硬件驱动,所以才去用HAL方式绕过GPL。
- 针对某些硬件,Android有一些特殊的需求。
- 不同的平台厂商可在遵循HAL调用接口的前提下实现自己的HAL,不会影响到上层的调用者,这样降低了模块间的耦合度,可以让平台开发者只关心HAL本身的实现即可。
下图是HAL在android系统中所处的位置:
从这张图中可以看出,HAL把内核和framework隔离开来,使上层的开发可以不依赖内核与驱动的实现。在android源码中,HAL大致位于下面几个位置:
- libhardware_legacy/ - 旧的架构、采取链接库模块的模式进行。
- libhardware/ - 新架构、调整为 HAL stub 的概念。
- ril/ - Radio Interface Layer。
- msm7k QUAL平台相关。
主要包含以下一些模块:Gps、Vibrator、Wifi、Copybit、Audio、Camera、Lights、Ril、Gralloc等。
2. HAL的两种实现方式
下图分别为旧的HAL实现与新的HAL实现框图: