Android硬件抽象层(HAL)概要介绍和学习计划

 Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。我们知道,Linux内核源代码版权遵循GNU License,而android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,在手机市场竞争激烈的今天,这对厂家来说,损害是非常大的。因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。

《Android系统源代码情景分析》一书正在进击的程序员网(http://0xcc0xcd.com)中连载,点击进入!

     撇开这些争论,学习Android硬件抽象层,对理解整个Android整个系统,都是极其有用的,因为它从下到上涉及到了Android系统的硬件驱动层、硬件抽象层、运行时库和应用程序框架层等等,下面这个图阐述了硬件抽象层在Android系统中的位置,以及它和其它层的关系:

     在学习Android硬件抽象层的过程中,我们将会学习如何在内核空间编写硬件驱动程序、如何在硬件抽象层中添加接口支持访问硬件、如何在系统启动时提供硬件访问服务以及 如何编写JNI使得可以通过Java接口来访问硬件,而作为中间的一个小插曲,我们还将学习一下如何在Android系统中添加一个C可执行程序来访问硬件驱动程序。由于这是一个系统的学习过程,笔者将分成六篇文章来描述每一个学习过程,包括:

     一. 在Android内核源代码工程中编写硬件驱动程序

     二. 在Android系统中增加C可执行程序来访问硬件驱动程序

     三. 在Android硬件抽象层增加接口模块访问硬件驱动程序

     四. 在Android系统中编写JNI方法在应用程序框架层提供Java接口访问硬件

     五. 在Android系统的应用程序框架层增加硬件服务接口

     六. 在Android系统中编写APP通过应用程序框架层访问硬件服务

     学习完这六篇文章,相信大家对Android系统就会有一个更深刻的认识了,敬请关注。

老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注!

174
12
 
 
猜你在找
机器学习之概率与统计推断
机器学习之数学基础
机器学习之凸优化
机器学习之矩阵
响应式布局全新探索
探究Linux的总线、设备、驱动模型
深度学习基础与TensorFlow实践
深度学习之神经网络原理与实战技巧
前端开发在线峰会
TensorFlow实战进阶:手把手教你做图像识别应用
查看评论
31楼  fubaojun2006 2016-09-18 14:39发表 [回复]
博主很强大,我一口气看完了整个系列的文章,虽然大部分代码我并没有仔细推敲,但是,整个系列的文章已经给我建立了一个宏观的从
驱动底层===》JNI层 ===》Framework层===》APK应用层,
的一整套完整的框架思路。
这个系列的文章,我感觉我至少还要详细研读三遍,来认真掌握每一个细节。
30楼  花开砍折 2016-07-18 16:17发表 [回复]
罗老师,能讲一下,你博客中讲到的android源代码是那个版本的?
29楼  CodeMartin 2016-05-25 11:25发表 [回复]
blog写的不错,买了一本你的书,学习一下.
28楼  yhyuan0607 2015-06-19 16:05发表 [回复]
刚开始起步学习android。。
27楼  mikelvox 2015-04-22 11:52发表 [回复]
提醒大家一下,虚拟机30个G,编译了几个小时,又提示空间不足了,大家把虚拟机弄大些吧。
Re:  tyy-forever 2015-11-24 17:20发表 [回复]
回复mikelvox:我从20G递推到后来的80G,最后想想还是用linux系统了。
26楼  甲壳虫1991 2015-03-06 16:49发表 [回复]
楼主讲得不错啊
25楼  CPJ_Phone 2015-02-06 17:04发表 [回复]
先留脚步,多多看齐,学习^_^
24楼  xukai871105 2014-08-13 08:56发表 [回复]
前来膜拜,并认真阅读您的文章,仔细体会!
23楼  HUA362427 2014-07-10 16:19发表 [回复]
大牛,能描述下你的修炼之路吗?很关心,新手刚上路,想有个参照和指引!
22楼  madMrz 2014-06-23 22:36发表 [回复]
mark
21楼  orathee 2014-03-17 15:43发表 [回复]
不熟悉C的表示完全看不懂啊
20楼  Wenleon 2014-01-10 09:24发表 [回复]
亲们,老罗辛苦了,记得投票哈。。。
19楼  liuwenping08 2014-01-08 13:36发表 [回复]
学习了
18楼  jifengjiaer 2014-01-02 16:10发表 [回复]
一口气看完6篇真是作用巨大
17楼  Jeff-HT-Lee 2013-11-27 17:16发表 [回复]
相当好,一口气浏览完了6篇文章,从kernel到APP整个流程打通了。回头得好好学习……
16楼  velanjun 2013-10-14 16:03发表 [回复]
看完您的文章,顿时醍醐灌顶,谢谢博主无私的分享~
15楼  杭州山不高 2013-07-22 09:19发表 [回复]
已经跑通了,感谢!
14楼  ANQIANGQIANG 2013-06-19 17:39发表 [回复]
学习中,感觉博主相当的厉害和无私,赞一个!
13楼  ljbphoebe 2013-04-11 11:33发表 [回复]
想请教一下博主,我在移植程序过程中遇到Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)错误,想通过logcat中打印出源码出错位置,需要怎么设置啊
Re:  韩半仙 2014-03-16 15:04发表 [回复]
回复ljbphoebe:你看这个错误的上一行,应该是有个framework目录下面的jar包的问题,把那个jar包重新push进去就可以了
12楼  ximen250 2013-04-07 22:16发表 [回复]
大牛已经不能形容了。巨牛
11楼  高山流水29 2013-03-24 10:45发表 [回复]
强大的博主
10楼  Wxingyu 2012-10-26 09:20发表 [回复]
奥 不过还是谢谢你的分享 对我很有帮助
Re:  xueying3796 2013-08-20 22:17发表 [回复]
回复Wxingyu:PHONEAPP出发,主要是建一个PHONE(GSMPHONE)以及RIL(这个是重中之重),基本上可以从PHONEAPP出发,一路走下去,就可以知道基本流程了。总之,最终都需要通过RIL去与底层驱动交互。
9楼  Wxingyu 2012-10-25 19:59发表 [回复]
楼主 你好 我是一个刚接触android不久的新手 我想问一下关于android手机电话模块从底层驱动到应用程序的设计大概过程和思路
Re:  罗升阳 2012-10-25 20:09发表 [回复]
回复Wxingyu:没研究过电话功能这一块,抱歉,回答不了你。
8楼  google_lover 2012-08-18 12:20发表 [回复]
博主您好,我想问一下,android的java界面应用程序访问硬件需要经过这么多层的周折,是不是应用程序的执行效率就打折好多了?有没有提高效率的好方法呢?
Re:  罗升阳 2012-08-18 17:42发表 [回复]
回复songqqnew:在Java这一层,效率上的确是会打一些折扣,不过以现在的虚拟机优化技术以及硬件性能的提升,这些不会是太大的问题。如果真的是对性能敏感的话,可以考虑用NDK来实现关键部分。
7楼  Gongqingshuai 2012-04-23 17:24发表 [回复]
急求!!!
在编译Android源码时出现下面的错误
host Executable: grxmlcompile (out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile) out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/gr_iface.o: file not recognized: File truncated collect2: ld returned 1 exit status make: *** [out/host/linux-x86/obj/EXECUTABLES/grxmlcompile_intermediates/grxmlcompile] Error 1
我的32位ubuntu jdk6
6楼  ye7813629 2012-03-02 17:52发表 [回复]
我现在的新项目也要做到这些了,现在我对方面完全不了解(以前是纯应用层的),看来要下苦工去学习了..........到时候遇到无法解决的问题方便请教下楼主么?
5楼  realzxy 2012-01-10 15:59发表 [回复]
罗老师,有个问题困扰我很久想问一下,照博文中的描述,很多厂商都没有公布HAL层的源代码,而只公布了Kernel的源代码,而网上有很多人在自己定制某一款机型的rom,比如CM组织,他们没有HAL的源代码又是怎么编译出特定机型的rom呢?
Re:  xiaofeishou 2012-04-16 13:39发表 [回复]
回复realzxy:有的使用的原有手机的lib实现的 看看CM7的实现就明白了
Re:  罗升阳 2012-01-11 14:37发表 [回复]
回复realzxy:这些ROM不一定是自己编译出来的吧,一般是用官方提供的,不过可以自己修改一些参数。
4楼  floweriswho 2011-11-01 22:40发表 [回复]
我能好奇的问一下?
罗老师
你是搞java的还是C的还是硬件的阿?方便说一下么?
Re:  罗升阳 2011-11-02 21:35发表 [回复]
回复floweriswho:除了不玩硬件,其它的都玩,呵呵
Re:  floweriswho 2011-11-02 22:44发表 [回复]
回复Luoshengyang:这是我的qq号。。。方便的话加一下。。。
很关心楼主是怎么炼成的。
QQ:121059530
Re:  罗升阳 2011-11-03 21:24发表 [回复]
回复floweriswho:不习惯在QQ上交流:)
3楼  RyanZX 2011-09-20 15:26发表 [回复] [引用] [举报]
系统的看了下博主的HAL的文章,有点不明白的地方希望给予指点:
1.
IHelloService.iadl的文件 似乎是为了自动生成Stub类用来给
HelloSerivce这个类来继承,这个自动生成的IHelloService.Stub是放在什么位置呢?我搜索源码没有找到。
2.
java的app程序里面通过下面这行代码来获取启动的service
helloService = IHelloService.Stub.asInterface(ServiceManager.getService("hello")); 
能否直接new一个helloService对象呢?
Re:  罗升阳 2011-09-20 15:45发表 [回复] [引用] [举报]
回复RyanZX:1. IHelloService.aidl编译之后,会生成一个IHelloService.java文件,这个中间文件放在out/target/product目录下的某一个子目录下,你可以去搜一下
2. 可以直接new一个HelloService出来,但是不建议这种做法,像这种硬件Service一般都是单例模式的,交给ServiceManager来管理
Re:  RyanZX 2011-09-20 16:57发表 [回复] [引用] [举报]
回复Luoshengyang:还有一个问题,如果不用service这种IPC通讯机制
是不是可以com_android_server_HelloService.cpp
的JNI层暴露出驱动的java接口之后 直接在app里面调用呢??
Re:  罗升阳 2011-09-20 17:47发表 [回复] [引用] [举报]
回复RyanZX:可以
Re:  RyanZX 2011-09-20 16:36发表 [回复]
回复Luoshengyang:多谢回复 找到文件位置了/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/
2楼  大只辉 2011-08-08 20:05发表 [回复]
想问一下博主,想系统的学习一下硬件抽象层,有什么好的书籍或者资料可以提供参考一下!
Re:  罗升阳 2011-08-08 21:00发表 [回复]
回复linhui568:源代码就是最好的资料了哦
Re:  大只辉 2011-08-11 15:41发表 [回复]
回复Luoshengyang:但是有一些原理性的东西,作为初学者,光看代码效率不是很明显啊!
Re:  罗升阳 2011-08-11 17:40发表 [回复]
回复linhui568:找准要研究的点,代码看不明白,再到网上找资料。
目前我还没有接触过相关的书籍,所以也不好给你推荐。
1楼  大只辉 2011-07-26 12:15发表 [回复]
回复Luoshengyang:但是使用原来的kernel就可以进入,使用我的内核却进入不了啊!而且如果使用我的kernel,emulator进入不了android系统。
Re:  韩半仙 2014-03-16 15:09发表 [回复]
回复linhui568:adb logcat查看系统启动的log,应该是某个位置出错了,贴log出来再定位错误
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值