HAL是建立在Linux驱动之上的一套程序。这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层。增加HAL的主要目的除了尽量避免应用程序直接访问Linux驱动外,还有一个重要原因,就是保护“私人财产”。那么它又是怎么保护的呢?
HAL所在的位置是Android的系统运行库层,在应用框架层和Linux内核层之间,而Android采用了Apache Licence2.0协议发布,Apache Licence2.0协议并未要求使用基于Apache Licence2.0协议的源代码的软件也必须开源。由于HAL属于Android的一部分,自然也不必开源了。当然加入HAL还有其他目的:统一硬件的调用接口;针对一些特殊的要求。
HAL的架构由最开始到现在有了很大的变化,原始的架构暂且不说,新版本的Android系统将HAL架构修改成了如图所示样子。
从上图可以看出,调用HAL模块的代码并不需要直接装载.so文件,而只需通过一个ID来定位相应的.so文件。
AndroidHAL的源代码存储的位置并不固定,一般会存储在Android源代码目录/hardware目录中,其中Android源代码目录/hardware/libhardware_legacy目录用来存储臼HAL架构的源代码文件。新HAL架构的源代码在Android源代码目录/hardwarelibhardware目录中。当然也可以放在Android源代码目录/hardware或其他目录中。最终编译生成的.so文件主要放在Android系统的/system/lib/hw目录,同样可以放其他目录。
通过上面的介绍对HAL已经有了大概的了解,那么该怎么编写一款支持HAL的Linux驱动程序呢?
1、编写Linux驱动,如果要为Linux驱动添加HAL,而且想尽量保护敏感数据,Linux驱动的代码要尽量简洁,尽可能将业务逻辑放到HAL Library中。
2、编写HAL Library,这其实就是普通的Linux Library文件,但这类库文件有一个接口。通过HAL_MODULE_INFO_SYM变量实现。Service Library就是通过在这个接口中定义的ID定位HAL Libary的。
3、编写Service Library,这一步其实并不是必须的,但是心的HAL架构要求我们这样做。Service Library也是Linxu Library。这一步比较灵活。Service Library可以是一般的Linux Library,也可以是JNI Library。
以上就是一个支持HAL的Linux驱动程序编写的步骤。