博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 源码分析之旅4 1 Android HAL层概述
阅读量:5992 次
发布时间:2019-06-20

本文共 1613 字,大约阅读时间需要 5 分钟。

前言

在学习HAL层之前,先来回顾一下整个Android的系统架构:

首先,从宏观上来看,整个Android的系统架构是一种C/S架构,上层与底层通过Binder IPC进行通信。当然,谁负责transact,谁就是客户端,另外一个就是服务端。

HAL层是位于Android System Services与Linux Kernel之间的一层,与这两层进行打交道。先对HAL层的位置与作用有个大致的了解,下面的章节开始详细介绍。

HAL层概述

HAL层,英文全称是Hardware Abstraction Layer,直译过来就是硬件抽象层 (HAL)。

HAL层定义一个标准接口以供硬件供应商实现,并允许 Android 忽略较低级别的驱动程序实现。借助 HAL,可以顺利实现相关功能,而不会影响或无需更改更高级别的系统。HAL 实现会被封装成模块 (.so) 文件,并会由 Android 系统适时地加载。

常见的HAL层的模块有:

根据官网的介绍,我们必须为自己的产品所提供的特定硬件实现相应的 HAL(和驱动程序)。HAL 实现通常会内置在共享库模块(.so 文件)中。Android 并不要求我们的 HAL 实现与设备驱动程序之间进行标准交互,因此我们可以自由地根据自己的具体情况执行适当的操作。不过,要使 Android 系统能够与我们的硬件正确互动,我们必须遵守各个针对特定硬件的 HAL 接口中定义的合同。

关于我们开发者,这里做个小总结:

  1. 开发者必须遵守HAL接口的规范
  2. HAL层可以在不考虑底层的东西,可以调用底层。因为只提供了基本的IO操作,具体实现由硬件厂商提供
  3. HAL层的代码最终编译为.so动态链接库

为什么需要有HAL层

总结起来,有下面几点原因。

1. 统一接口,降低依赖

硬件接口是由Linux Kernel提供的,Android Framework和Linux Kernel层会产生依赖性。

为了把Android Framework和Linux Kernel分开,让Android Framework不至于过度依赖Linux Kernel,屏蔽了不同硬件设备的差异,有必要设计HAL层来提供一个统一的硬件操作接口。

2. 解决开源与商业的矛盾

由于Android是基于Linux内核的,而Linux是开源并且采用GPL协议的。Linux可以开放使用,但是存在版权问题、协议问题。

使用了GPL的函数库,必须公开源码。Android由于使用了Linux,就逃避不了GPL协议,就必须把所有源代码公开。因此也必须公开硬件操作相关的代码,但是这与硬件厂商的利益存在冲突。

硬件厂商是不希望公开硬件操作的核心代码的。HAL层的出现,硬件厂商可以把硬件操作的核心代码放到HAL层中,最终可以通过.so库(二进制)的方式来提供,而Linux Kernel层只留下一些简单的I/O读写操作。HAL层是基于Apache协议的,HAL层中的硬件操作的核心代码就得到了保护。

这里就衍生出了两个概念:

  1. 用户空间:HAL
  2. 内核空间:Linux Kernel

存在的争议

HAL层是Android提供的一个解决开源与商业矛盾的一个范例,目前来说虽然获得很大的成功,但是也存在很大的争议。

刚开始,Android是作为Linux的一个分支出现的,后来因为Android不按套路出牌,总是避开GPL协议。后来Linux就把Android从Linux分支中剔除了。因此我们常说:Android是开放平台,而不是开源平台。

参考文章:

http://blog.chinaunix.net/uid-27411029-id-3481139.html

如果觉得我的文字对你有所帮助的话,欢迎关注我的公众号:

我的群欢迎大家进来探讨各种技术与非技术的话题,有兴趣的朋友们加我私人微信huannan88,我拉你进群交(♂)流(♀)

转载地址:http://xuxlx.baihongyu.com/

你可能感兴趣的文章
【转】Java虚拟机的JVM垃圾回收机制
查看>>
北京Uber优步司机奖励政策(12月16日)
查看>>
图解集合6:LinkedHashMap
查看>>
基于场景的测试
查看>>
学点PYTHON基础的东东--数据结构,算法,设计模式---访问者模式
查看>>
[MySQL FAQ]系列 -- Too many open files
查看>>
TCP/IP模型各个层次的功能和协议
查看>>
C 游戏所要看的书
查看>>
Ehcache详细解读(转)
查看>>
UIImagePickerController本地化控件文字
查看>>
CSS3 页面跳转的动画效果
查看>>
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
查看>>
POJ 2676/2918 数独(dfs)
查看>>
Linux kernel Panic 相关知识
查看>>
iOS 从相机或相册获取图片并裁剪
查看>>
sn9c291 驱动载入成功,mpayer无法播放
查看>>
ansilbe 入门001、ansible的介绍
查看>>
C++14介绍
查看>>
iOS-- 快速集成iOS基于RTMP的视频推流
查看>>
BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]
查看>>