最近和另外一家开发公司涉及到合作,一直希望了解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转相关推荐

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

    http://blog.csdn.net/luoshengyang/article/details/6567257 Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接 ...

  2. Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了SurfaceFlinger服务.有了这些预备知识之后,我们就可以从正面来分析SurfaceFlinger ...

  3. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划

    在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中.它有两个特点,一是能够辅助内存管理系统来有效地 ...

  4. Android进程间通信(IPC)机制Binder简要介绍和学习计划

    在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这些Activity和Service有可能运行在同一个进程中,也有可能运行在不同的进程中.那么,不在同一个进程的 ...

  5. Android应用程序组件Content Provider简要介绍和学习计划

    在Android系统中,Content Provider作为应用程序四大组件之一,它起到在应用程序之间共享数据的作用,同时,它还是标准的数据访问接口.前面的一系列文章已经分析过Android应用程序的 ...

  6. Android窗口管理服务WindowManagerService的简要介绍和学习计划

    在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的实现要更复杂,因为它们的类型和作用不同,且会相互影响.在 ...

  7. Android WebView简要介绍和学习计划

    我们通常会在App的UI中嵌入WebView,用来实现某些功能的动态更新.在4.4版本之前,Android WebView基于WebKit实现.不过,在4.4版本之后,Android WebView就 ...

  8. 老郭的《Dalvik虚拟机垃圾收集机制简要介绍和学习计划》

    伴随着"Dalvik is dead,long live Dalvik"这行AOSP代码提交日志,在Android5.0中,ART运行时取代了Dalvik虚拟机.虽然Dalvik虚 ...

  9. Chromium视频标签video简要介绍和学习计划

    随着互联网的发展,在网页上观看视频变得越来越流行,尤其是泛娱乐(手机直播)大行其道的今天.在HTML5之前,在网页上播放视频需要插件支持,例如Flash插件.有了HTML5之后,标签<video ...

最新文章

  1. github创建项目,并提交本地文件
  2. 年度总结 | 2020CSDN的第一桶金
  3. sublime4 安装pretty json 并绑定快捷键
  4. Activity和Service通信 Bind方式
  5. JQuery 加载 CSS、JS 文件
  6. 设置ROS机器人避免行走到地图未知区域
  7. java实现redis客户端_windows下java swt实现操作redis的客户端工具
  8. graphpad两组t检验_Graphpad 分析教程 | 手把手教你玩转独立样本 t 检验
  9. 腾讯元老、上市公司CTO辞职后,每天对着200亩地发呆!
  10. 如何在oracle建立中间库,Oracle数据库如何创建DATABASE LINK?
  11. 上海科技大学计算机夏令营随笔
  12. VirtualBox安装及网络配置
  13. ATTCK实战系列(二)琢磨篇
  14. hdu 1705[皮克定理]
  15. python如何把ts视频拼接起来_Python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频...
  16. BZOJ4372: 烁烁的游戏(动态点分治)
  17. 哈希表构造与处理冲突方法
  18. 使用Maven WAR插件实现多Web应用间的重迭运用
  19. Linux命令+基础知识
  20. <FreeRTOS入门第九节>事件标志位

热门文章

  1. 前端学习(3217):prop的基本使用
  2. 前端学习(3007):vue+element今日头条管理--消息提示
  3. [html] img中的src加载失败时如何用默认图片来替换呢?
  4. [html] 如何在页面引用外部的html页面?
  5. [html] 你对标签语义化的理解是什么?
  6. [vue] 为何官方推荐使用axios而不用vue-resource?
  7. [css] pseudo-class与pseudo-element有什么区别?
  8. 前端学习(2192):Promise的all的使用
  9. html:(30):继承和特殊性
  10. java学习(38):数组排序(直接排序)