前言
在学习HAL层之前,先来回顾一下整个Android的系统架构:
首先,从宏观上来看,整个Android的系统架构是一种C/S架构,上层与底层通过Binder IPC进行通信。当然,谁负责transact,谁就是客户端,另外一个就是服务端。
HAL层是位于Android System Services与Linux Kernel之间的一层,与这两层进行打交道。先对HAL层的位置与作用有个大致的了解,下面的章节开始详细介绍。
HAL层概述
HAL层,英文全称是Hardware Abstraction Layer,直译过来就是硬件抽象层 (HAL)。
HAL层定义一个标准接口以供硬件供应商实现,并允许 Android 忽略较低级别的驱动程序实现。借助 HAL,可以顺利实现相关功能,而不会影响或无需更改更高级别的系统。HAL 实现会被封装成模块 (.so) 文件,并会由 Android 系统适时地加载。
常见的HAL层的模块有:
根据官网的介绍,我们必须为自己的产品所提供的特定硬件实现相应的 HAL(和驱动程序)。HAL 实现通常会内置在共享库模块(.so 文件)中。Android 并不要求我们的 HAL 实现与设备驱动程序之间进行标准交互,因此我们可以自由地根据自己的具体情况执行适当的操作。不过,要使 Android 系统能够与我们的硬件正确互动,我们必须遵守各个针对特定硬件的 HAL 接口中定义的合同。
关于我们开发者,这里做个小总结:
- 开发者必须遵守HAL接口的规范
- HAL层可以在不考虑底层的东西,可以调用底层。因为只提供了基本的IO操作,具体实现由硬件厂商提供
- HAL层的代码最终编译为.so动态链接库
为什么需要有HAL层
总结起来,有下面几点原因。
1. 统一接口,降低依赖
硬件接口是由Linux Kernel提供的,Android Framework和Linux Kernel层会产生依赖性。
为了把Android Framework和Linux Kernel分开,让Android Framework不至于过度依赖Linux Kernel,屏蔽了不同硬件设备的差异,有必要设计HAL层来提供一个统一的硬件操作接口。
2. 解决开源与商业的矛盾
由于Android是基于Linux内核的,而Linux是开源并且采用GPL协议的。Linux可以开放使用,但是存在版权问题、协议问题。
使用了GPL的函数库,必须公开源码。Android由于使用了Linux,就逃避不了GPL协议,就必须把所有源代码公开。因此也必须公开硬件操作相关的代码,但是这与硬件厂商的利益存在冲突。
硬件厂商是不希望公开硬件操作的核心代码的。HAL层的出现,硬件厂商可以把硬件操作的核心代码放到HAL层中,最终可以通过.so库(二进制)的方式来提供,而Linux Kernel层只留下一些简单的I/O读写操作。HAL层是基于Apache协议的,HAL层中的硬件操作的核心代码就得到了保护。
这里就衍生出了两个概念:
- 用户空间:HAL
- 内核空间:Linux Kernel
存在的争议
HAL层是Android提供的一个解决开源与商业矛盾的一个范例,目前来说虽然获得很大的成功,但是也存在很大的争议。
刚开始,Android是作为Linux的一个分支出现的,后来因为Android不按套路出牌,总是避开GPL协议。后来Linux就把Android从Linux分支中剔除了。因此我们常说:Android是开放平台,而不是开源平台。
参考文章:
http://blog.chinaunix.net/uid-27411029-id-3481139.html
如果觉得我的文字对你有所帮助的话,欢迎关注我的公众号:
我的群欢迎大家进来探讨各种技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)。