作者:唐老师,华清远见嵌入式学院讲师。

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,同一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第一次被使用时加载到内存,后续再使用时仅返回硬件对象操作接口,不会存在设备多次打开问题,并且由于多进程访问时返回的只是函数指针,代码没有重入问题。

文章来源:华清远见嵌入式学院原文地址:http://www.embedu.org/Column/Column707.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>

深入浅出 - Android系统移植与平台开发(七)- 初识HAL的更多相关文章

  1. 深入浅出 - Android系统移植与平台开发(一)

    深入浅出 - Android系统移植与平台开发(一) 分类: Android移植2012-09-05 14:16 16173人阅读 评论(12) 收藏 举报 androidgitgooglejdkub ...

  2. 深入浅出 - Android系统移植与平台开发(七)- 初识HAL【转】

    本文转载自:http://blog.csdn.net/mr_raptor/article/details/8069588 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   ...

  3. 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器

    作者:唐老师,华清远见嵌入式学院讲师. 1.   编译Android模拟器 在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和在windows里下载的看起来没有什么区别 ...

  4. 深入浅出 - Android系统移植与平台开发(五)- 编译Android源码(转)

    2.3编译Android源码 Android源码体积非常庞大,由Dalvik虚拟机.Linux内核.编译系统.框架代码.Android定制C库.测试套件.系统应用程序等部分组成,在编译Android源 ...

  5. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)

    第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...

  6. 深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制(瘋耔修改篇一)

    首先非常感谢原文作者为我们提供的知识库,因为有你们的贡献,我们的开发难度更显简单 原文 :   http://blog.csdn.net/mr_raptor/article/details/30113 ...

  7. 深入浅出 - Android系统移植与平台开发(二) - 准备Android开发环境

    作者:唐老师,华清远见嵌入式学院讲师. 编译Android源码 关于android系统的编译,Android的官方网站上也给出了详细的说明.http://source.android.com/sour ...

  8. 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速

    作者:唐老师,华清远见嵌入式学院讲师. Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速度越来越快,但是随着新 版本的出现,其启动速度一直都比较慢,当然,作为程序员,我们 ...

  9. 深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制

    第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架 ...

随机推荐

  1. Jenkins搭建

    1.添加仓库: sudo wget -O /etc/yum.repos.d/jenkins.repo \ http://jenkins-ci.org/redhat/jenkins.repo sudo ...

  2. Oracle12c client安裝報錯[INS-20802] Oracle Net Configuration Assistant failed完美解決

    Doc ID 2082662.1 1.錯誤碼 Installation Of Oracle Client 12.1.0.2.0 (32-bit) Fails With An Error Message ...

  3. angularjs实战

    1.指令  transclude 保留原来的内容 replace 去掉<my-directive>指令 <script src="http://apps.bdimg.com ...

  4. android 入门-动画与容器

    set 动画容器 可作为资源id添加R.anim.xxxx   可用于在样式表中添加  http://blog.csdn.net/liuhe688/article/details/6660823 in ...

  5. JDK 1.5 1.6 override区别

    今天在更新时发现有个别项目报错,报错信息 到网上搜索了之后,根据网上描述,修改了一批配置都不行: http://bestchenwu.iteye.com/blog/997420(这个里面的方法二,即为 ...

  6. Sizeof与Strlen的区别与联系(转)

    Sizeof与Strlen的区别与联系 一.sizeof     sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型 ...

  7. Servlet请求头response应用简单案例

    Servlet请求头response应用简单案例:访问AServlet重定向到BServlet,5秒后跳到CServlet,并显示图片: AServlet package cn.yzu; import ...

  8. 【MongoDB】3.详细命令集合

    [注意:MongoDB自动将_id字段设置为主键] -------------------------------------------------------------------------- ...

  9. 一张图入门python

  10. ASP.NET 取消和禁用缓存

    客户端取消: <html> <head> <meta http-equiv="Expires" CONTENT="0"> & ...