Android HAL概念介绍
Android系统硬件抽象层(Hardware Abstraction Layer,HAL)是连接Android Framework与内核设备驱动的重要桥梁。其主要设计意图是向下屏蔽设备以及其驱动的实现细节,向上为系统服务以及Framework提供提供统一的设备访问接口。同时Google基于保护硬件厂商知识产权的考量,选择Apache开源许可证以避开GPL开源协议的约束,允许硬件厂商不公开源码,将设备相关的实现放在HAL层中实现并以共享库(.so)的形式提供。
HAL规范提供了标准的数据结构和接口方法,为不同硬件的系统服务定义了标准接口,不同的硬件厂商只需实现相应的接口即能使设备为Android系统所用。这种设计模式使得上层服务于低层硬件之间的耦合度降低。下图是Android HAL标准组件。
Legacy HAL与Stub HAL
Android HAL有两种实现方式:Legacy HAL以及Stub HAL。Android在初期使用的是Legacy方式的HAL,这种方式的即标准的Linux共享库(Shared Library, .so),其他程序直接调用HAL so库中导出的函数(非静态函数均可以被外部程序调用);Google后来提出了Stub方式的HAL,Stub是一种存根的概念,即把所有的供外部访问的方法(或函数)的入口指针(函数指针)保存在统一的数据结构中。Stub方式的HAL仍然以so库形式存在,其他程序在需要访问HAL中的方法时,先获得Stub然后再通过Stub中的函数指针访问具体的函数。
可以看出Legacy方式的HAL直接导出方法供外部调用,有可能导致名字空间泛滥,多个HAL so库中方法名有可能重名,而Stub方式的HAL方法被隐藏起来,外部程序仅能够访问Stub中“登记”了的方法。
Android中新的硬件均采用Stub方式的HAL,因此本文仅介绍Stub方式的HAL开发方法。
HAL标准接口的定义
Android已经为常用的硬件设备定义了标准的HAL接口,这些设备有Audio、Camera、Bluetooth、Graphics、Input等。如果你要为这些设备编写HAL代码,你应该严格按照Google定义标准接口实现,另辟蹊径则将导致设备无法在Android Framework下正常工作。
HAL源码位于Android源码的hardware目录中,其中所有Stub方式的HAL实现位于libhardware目录下。
android-src/hardware/libhardware/include/ : 常用设备HAL标准接口的头文件
android-src/hardware/libhardware/modules/ :常用设备HAL标准接口实现或示例