快捷搜索:

[Android的系统移植与平台开发]初识HAL

1.HAL的module与stub

HAL(Hardware AbstractLayer)硬件抽象层是Google开拓的Android系统里上层利用对底层硬件操作樊篱一个软件层次,说白了,便是上层的利用不用关心底层硬件详细若何事情的,只要向上层供给一个统一的接口即可,这种设计思惟广泛的存在于当前的软件架构设计里。

严格来讲,Android系统里完全可以没有HAL硬件抽象层,上层利用层可以经由过程API调用到底层硬件,然则Android自呈现开始不停打着开源的旗号,而一些硬件厂商因为商业身分,不盼望自己的核心代码开源出来,而只是供给二进制代码。别的,Android系统里应用的一些硬件设备接口可能不是应用的Linux Kernel的统一接口,并且还有GPL版权的缘故原由,以是Google晦气己,在Android的架构里提出了HAL的观点,这个HAL着实便是硬件自力的意思,Android系统不依附于某一个详细的硬件驱动,而是依附于HAL代码,这样,第三方厂商可以将自己不开源的代码封装在HAL层,仅供给二进制。

HAL的架构分为两种:

Ø旧的架构module

Ø新的架构modulestub

1.1 module架构

旧的架构对照好理解,Android用户利用法度榜样或框架层代码由Java实现,Java运行在Dalvik虚拟机中,没有法子直接造访底层硬件,只能经由过程调用so本地库代码实现,在so本地库代码里有对底层硬件操作代码,如下图所示:

也便是说,利用层或框架层Java代码,经由过程JNI技巧调用C或C++写的so库代码,在so库代码中调用底层驱动,实现上层利用的提出的硬件哀求操作。实现硬件操作的so库为:module。

着实现流程如下图:

由此可见,Java代码要造访硬件效率着实挺低的,没有C代码效率高,然则Android系统在软件框架和硬件处置惩罚器上都在削减和C代码履行效率的差距,据国外测试的结果来看,基础上能达到C代码效率的95%阁下。

这种设计架构虽然满意了Java利用造访硬件的必要,然则,使得我们的代码高低层次间的耦合太高,用户法度榜样或框架代码必须要去加载module库,假如底层硬件有变更,moudle要从新编译,上层也要做响应的变更,别的,假如多个利用法度榜样同时造访硬件,都去加载module,同一设备被打开多次,还有代码的重入问题。是以,Google又提出了新的HAL架构。

1.2 新的HAL架构

新的架构应用的是module stub要领。Stub是存根或桩的意思,着实说白了,便是指一个工具代表的意思。由上面的架构可知,上层利用层或框架层代码加载so库代码,so库代码我们称为module,在HAL层注册了每个硬件工具的存根stub,当上层必要造访硬件的时刻,就从当前注册的硬件工具stub里查找,找到之后stub会向上层module供给该硬件工具的operations interface(操作接口),该操作接口就保存在了module中,上层利用或框架再经由过程这个module操作接口来造访硬件。如下图,以Led为例的示意图:

Led App为Android 利用法度榜样,Led App里的Java代码不能操作硬件,将硬件操作事情交给本地module库 led_runtime.so,它从当前系统中查找Led Stub,查找到之后,Led Stub将硬件驱动操作返回给module,Led App操作硬件时,经由过程保存在module中的操作接口间接造访底层硬件。

问题来了:

Ø麻烦,感觉比module要领繁杂

Ø硬件工具如何注册为stub?

Ø上层若何查找硬件工具的stub?

“麻烦”是确定的,然则Google这么智慧的公司弗成能是光制造麻烦的公司,肯定是斟酌到其它的良好性才应用这种要领。

1.3Module架构与Stub构架比较

在Module架构中,本地代码由so库实现,上层直接将so库映射进进程空间,会有代码重入及设备多次打开的问题。新的Stub框架虽然也要加载module库,然则这个module已经不包孕操作底层硬件驱动的功能了,它里面保存的只是底层Stub供给的操作接口,底层Stub扮演了“接口供给者”的角色,当Stub第一次被应用时加载到内存,后续再应用时仅返回硬件工具操作接口,不会存在设备多次打开问题,并且因为多进程造访时返回的只是函数指针,代码没有重入问题。

您可能还会对下面的文章感兴趣: