Android硬件抽象层(HAL)概要介绍和学习计划 1转
最近和另外一家开发公司涉及到合作,一直希望了解Android从Linux到App整个架构和流程,那家开发工程师也不断提供帮助,不过如果借助后面几篇博客,相对系统和完整的可以了解更加清晰,
<博客:http://blog.csdn.net/luoshengyang/article/details/6567257>
Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。我们知道,Linux内核源代码版权遵循GNU License,而Android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,在手机市场竞争激烈的今天,这对厂家来说,损害是非常大的。因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。
撇开这些争论,学习Android硬件抽象层,对理解整个Android整个系统,都是极其有用的,因为它从下到上涉及到了Android系统的硬件驱动层、硬件抽象层、运行时库和应用程序框架层等等,下面这个图阐述了硬件抽象层在Android系统中的位置,以及它和其它层的关系:
在学习Android硬件抽象层的过程中,我们将会学习如何在内核空间编写硬件驱动程序、如何在硬件抽象层中添加接口支持访问硬件、如何在系统启动时提供硬件访问服务以及 如何编写JNI使得可以通过Java接口来访问硬件,而作为中间的一个小插曲,我们还将学习一下如何在Android系统中添加一个C可执行程序来访问硬件驱动程序。由于这是一个系统的学习过程,笔者将分成六篇文章来描述每一个学习过程,包括:
一. 在Android内核源代码工程中编写硬件驱动程序。
二. 在Android系统中增加C可执行程序来访问硬件驱动程序。
三. 在Android硬件抽象层增加接口模块访问硬件驱动程序。
四. 在Android系统中编写JNI方法在应用程序框架层提供Java接口访问硬件。
五. 在Android系统的应用程序框架层增加硬件服务接口。
六. 在Android系统中编写APP通过应用程序框架层访问硬件服务。
学习完这六篇文章,相信大家对Android系统就会有一个更深刻的认识了,敬请关注。
转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3687614.html
Android硬件抽象层(HAL)概要介绍和学习计划 1转相关推荐
- Android硬件抽象层(HAL)概要介绍和学习计划
http://blog.csdn.net/luoshengyang/article/details/6567257 Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接 ...
- Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了SurfaceFlinger服务.有了这些预备知识之后,我们就可以从正面来分析SurfaceFlinger ...
- Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划
在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中.它有两个特点,一是能够辅助内存管理系统来有效地 ...
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中.那么,不在同一个进程的 ...
- Android应用程序组件Content Provider简要介绍和学习计划
在Android系统中,Content Provider作为应用程序四大组件之一,它起到在应用程序之间共享数据的作用,同时,它还是标准的数据访问接口.前面的一系列文章已经分析过Android应用程序的 ...
- Android窗口管理服务WindowManagerService的简要介绍和学习计划
在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的实现要更复杂,因为它们的类型和作用不同,且会相互影响.在 ...
- Android WebView简要介绍和学习计划
我们通常会在App的UI中嵌入WebView,用来实现某些功能的动态更新.在4.4版本之前,Android WebView基于WebKit实现.不过,在4.4版本之后,Android WebView就 ...
- 老郭的《Dalvik虚拟机垃圾收集机制简要介绍和学习计划》
伴随着"Dalvik is dead,long live Dalvik"这行AOSP代码提交日志,在Android5.0中,ART运行时取代了Dalvik虚拟机.虽然Dalvik虚 ...
- Chromium视频标签video简要介绍和学习计划
随着互联网的发展,在网页上观看视频变得越来越流行,尤其是泛娱乐(手机直播)大行其道的今天.在HTML5之前,在网页上播放视频需要插件支持,例如Flash插件.有了HTML5之后,标签<video ...
最新文章
- github创建项目,并提交本地文件
- 年度总结 | 2020CSDN的第一桶金
- sublime4 安装pretty json 并绑定快捷键
- Activity和Service通信 Bind方式
- JQuery 加载 CSS、JS 文件
- 设置ROS机器人避免行走到地图未知区域
- java实现redis客户端_windows下java swt实现操作redis的客户端工具
- graphpad两组t检验_Graphpad 分析教程 | 手把手教你玩转独立样本 t 检验
- 腾讯元老、上市公司CTO辞职后,每天对着200亩地发呆!
- 如何在oracle建立中间库,Oracle数据库如何创建DATABASE LINK?
- 上海科技大学计算机夏令营随笔
- VirtualBox安装及网络配置
- ATTCK实战系列(二)琢磨篇
- hdu 1705[皮克定理]
- python如何把ts视频拼接起来_Python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频...
- BZOJ4372: 烁烁的游戏(动态点分治)
- 哈希表构造与处理冲突方法
- 使用Maven WAR插件实现多Web应用间的重迭运用
- Linux命令+基础知识
- <FreeRTOS入门第九节>事件标志位
热门文章
- 前端学习(3217):prop的基本使用
- 前端学习(3007):vue+element今日头条管理--消息提示
- [html] img中的src加载失败时如何用默认图片来替换呢?
- [html] 如何在页面引用外部的html页面?
- [html] 你对标签语义化的理解是什么?
- [vue] 为何官方推荐使用axios而不用vue-resource?
- [css] pseudo-class与pseudo-element有什么区别?
- 前端学习(2192):Promise的all的使用
- html:(30):继承和特殊性
- java学习(38):数组排序(直接排序)