1、 HAL介绍
现有的HAL架构由patrick brady(Google)在2008 Google IO演讲中提出的,如下图:
Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开Linux的GPL束缚。思路是把控制硬件的动作放到了Android HAL中,而Linux driver仅仅完成一些简单的数据交互动作,甚至把硬件寄存器空间直接映射到user space。而Android是基于Apache的License,因此硬件厂商可以只提供二进制文件,所以说Android知识一个开放的平台,而不是一个开源的平台。也许也正是因为Android不遵循GPL,所以Greg KH在2.6.33内核将Android驱动从Linux中删除。GPL和硬件厂商目前还是有着无法弥合的裂痕。Android想要把这个问题处理好也不容易。
总结下来,Android HAL存在的原因主要有:
1. 并不是所有的硬件设备都有标准的Linux Kernel的接口;
2. Kernel driver涉及到GPL的版权。某些设备制造商并不愿意公开硬件驱动,所以才用HAL方式绕过GPL;
3. 针对某些硬件,Android有一些特殊的需求。
2、 在Android源码里,HAL的代码主要位于以下目录
1. libhardware_legacy/ -旧架构、采取连接库模块的观念进行;
2. libhardware/ -新架构、调整为 HALstub的观念;
3. ril/ - Radio Interface Layer,包括3G,GSM等电话功能;
4. msm7k、qcom、ti与平台相关的
主要包括一下一些模块:GPS,vibrator,wifi,copybit,audio,camera,lights,ril,overlay等。
3、新旧HAL对比
HAL架构慢慢完善,新架构与旧架构相比,抽象程度不断提高,把Android Framework和Linux Kernel很好的隔离开。让android 不至于过度的依赖Linux Kernel,在开发Android Framework时不必考虑底层的硬件的细节。
旧HAL架构
旧HAL架构的作法,是比较传统的module模式,也就是将*.so文件当做sharedlibrary来使用,在runtime(JNI部分)以direct function call使用HAL module。通过直接函数调用的方式来操作驱动程序。
当然,应用程序也可以不需要通过JNI的方式进行(黑色箭头),直接以载入*.so库(dlopen)的方式来调用*.so里的符号(symbol)也是一种方式。
总之是没有经过封装,上层直接操作硬件。
新HAL架构
新HAL架构的作法,就有了stub的味道。HAL stub是一种代理人(proxy)的概念,stub虽然仍是以*.so库存在,但HAL已经将*.so库封装起来了。Stub向HAL提供操作函数,而runtime则是向HAL取得特定模块(stub)的operations,在callback这些操作函数。这种以indirectfunction call的架构,让HAL stub变成是一种包含关系,即HAL里包含了许许多多的stub(代理人)。Runtime只要说明类型,即module ID,就可以取得操作函数。
HAL的未来发展
新的HAL作法,倾向全面采用JNI的方式进行。也就是,在Android的架构中,修改Androidruntime(即core library),在取得HAL模块的operations后再做callback操作。将HAL模块完全放在HAL里面。
源地址:http://www.jollen.org/blog/2009/10/android-hal-status-report.html