您的位置:首页 > 移动开发 > Android开发

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

2017-07-12 15:44 211 查看
 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
 
 

上一篇如何单独编译Android源代码中的模块

下一篇在Ubuntu上为Android系统编写Linux内核驱动程序

  相关文章推荐

• Android
HAL详解(一)

• 总结Android
HAL层的使用方法

• 为Android添加HAL模块

• Android中HAL如何向上层提供接口总结

• Android
HAL编程

• 深入浅出
- Android系统移植与平台开发(七)- 初识HAL

• Android
Hal层简要分析

• 关于Android的HAL的一些理解

• android系统硬件抽象层(HAL)原理及实现之原理

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

猜你在找
机器学习之概率与统计推断
机器学习之数学基础
机器学习之凸优化
机器学习之矩阵
响应式布局全新探索
探究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出来再定位错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: