Android的硬件抽象层和驱动体系为啥这么弱暴
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android的硬件抽象层和驱动体系为啥这么弱暴相关的知识,希望对你有一定的参考价值。
在各个厂商开发基于android系统的产品的时候,虽然有的时候也需要修改Android的框架,但是移植是其中的主要工作。 Android系统本身是一个庞大的系统,移植并不需要精通Android的每一个部分,需要考虑的是Android系统的硬件抽象层(HAL)和Linux中的相关设备驱动程序。如图1-3所示。 图1-3 Android移植的概念 基于Android系统的手机,包括G1、G2、Hero和Nexus One,其他的手机厂商也推出了几款Android手机。这些手机所使用的处理器和各种外围硬件各不相同,但是其使用的大部分Android系统的软件都是相同的(包括本地框架、虚拟机、Java框架和Java应用等部分)。 移植的目的就是为了改动较小的内容,支撑较为庞大上层的系统。同时由于硬件抽象层具有标准的接口,在各个不同的平台的实现中可以互相参考,虽然具体实现的内容不同,但是思路类似,可以相互参考。 Android系统的移植工作的目的是为了在特定的硬件上运行Android系统。在移植的过程中,把握关键要点,减少工作量是一个重要的方面。从工作的角度,通常的方法为,首先要熟悉硬件抽象层的接口,其次要集成和复用已有的驱动程序,主要的工作量在硬件抽象层的实现中。为了更好地理解和调试系统,也应该适当地了解上层对硬件抽象层的调用情况。 移植方面主要的工作有两个部分: Linux驱动 Android系统硬件抽象层 Linux中的驱动工作在内核空间,Android系统硬件抽象层工作在用户空间,有了这两个部分的结合,就可以让庞大的Android系统运行在特定的硬件平台上。 Android移植的主要工作如图1-4所示。 图1-4 Android移植的主要工作 在具有了特定的硬件系统之后,通常在Linux中需要实现其驱动程序,这些驱动程序通常是Linux的标准驱动程序,在Android平台和其他Linux平台基本上是相同的。主要的实现方面是Android系统中的硬件抽象层(Hardware Abstract Layer),硬件抽象层对下调用Linux中的驱动程序,对上提供接口,以供Android系统的其他部分(通常为Android本地框架层)调用。 提示:Android硬件抽象层的接口是本地移植层的接口,不属于标准API,不具有向前或者向后兼容性。 在Android系统需要移植的内容,主要包含了以下的各个部分: 显示部分(Display) 包括framebuffer驱动+Gralloc模块(可选择是否实现) 用户输入部分(Input) 包括Event驱动+EventHub(Android标准内容) 多媒体编解码(Codec) 包括硬件Codec驱动+Codec插件(如OpenMax) 3D加速器部分(3D Accelerator) 包括硬件OpenGL驱动+OpenGL插件 音频部分(Audio) 包括Audio驱动+Audio硬件抽象层 视频输出部分(Video Out) 包括视频显示驱动+Overlay硬件抽象层 摄像头部分(Camera) 包括Camera驱动(通常是v4l2)+Camera硬件抽象层 电话部分(Phone) Modem驱动程序+RIL库 全球定位系统部分(GPS) 包括GPS驱动(通常为串口)+GPS硬件抽象层 无线局域网部分(WIFI) 包括Wlan驱动和协议+WIFI的适配层(Android标准内容) 蓝牙部分(Blue Tooth) 包括BT驱动和协议+BT的适配层(Android标准内容) 传感器部分(Sensor) 包括Sensor驱动+Sensor硬件抽象层 震动器部分(Vibrator) 包括Vibrator驱动+Vibrator硬件抽象层(Android标准内容) 背光部分(Light) 包括Light驱动+ Light硬件抽象层 警告器部分(Alarm) 包括Alarm驱动和RTC系统+用户空间调用(Android标准内容) 电池部分(Battery) 包括电池部分驱动+电池的硬件抽象层(Android标准内容) Android中具有很多组件,但并不是每一个部件都需要移植,对于一些纯软的组件,就没有移植的必要。对于一些部件,例如浏览器引擎,虽然需要下层网络的支持,但是并非直接为其移植网络接口,而是通过无线局域网或者电话系统数据连接来完成标准的网络接口。 Android的移植主要可以分成几个类型:基本图形用户界面(GUI)部分,包括显示部分和用户输入部分;和硬件相关的加速部分,包括媒体编解码和OpenGL;音视频输入输出环节,包括音频,视频输出和摄像头部分;连接部分,包括无线局域网,蓝牙,GPS;电话部分;附属部件:包括传感器、背光、振动器等。 除了以上的移植方面,电源管理也是非常重要的一个方面,它和Android的各个子系统都有关系。 Android系统主要需要移植部件如图1-5所示。 图1-5 Android系统主要需要移植部件 对于大部分子系统,硬件抽象层和驱动程序都需要根据实际系统的情况实现,例如:传感器部分、音频部分、视频部分、摄像头部分、电话部分。也有一些子系统,硬件抽象层是标准的,只需要实现Linux内核中的驱动程序即可,例如:输入部分、振动器部分、无线局域网部分、蓝牙部分等。对于有标准的硬件抽象层的系统,有的时候通常也需要做一些配置工作。 时至今日,随着Android系统的发展,它已经不仅仅是一个移动设备的平台,也可以用于消费类电子和智能家电,例如:上网本、电子书、数字电视、机顶盒、固定电话等。在这些平台上,通常需要实现比移动设备更少的部件。一般来说,基本用户界面部分(包括显示和用户输入)是需要移植的,其他部分是可选的。例如:电话系统、振动器、背光、传感器等一般不需要在非移动设备系统来实现;对于一些固定位置设备通常也不需要实现GPS系统。图片无法显示,见谅 参考技术A 其实蛮正常的,移动设备驱动、系统、硬件需要紧密结合,扛不住太多的中间层。各厂商往往暴改原始驱动才能应用上。既然大家都改,又都有源代码,android就变成不是很在乎这个了。手机如果没升级,大家push的是手机厂商,不是google。所以google也不是特别在乎这方面的改进。而且即便google升级了版本号,手机厂商仍然不见得会跟着。
、本回答被提问者采纳
硬件抽象层
HAL是建立在Linux驱动之上的一套程序。这套程序库并不属于Linux内核,而是属于Linux内核层之上的应用层。增加HAL的主要目的除了尽量避免应用程序直接访问Linux驱动外,还有一个重要原因,就是保护“私人财产”。那么它又是怎么保护的呢?
HAL所在的位置是Android的系统运行库层,在应用框架层和Linux内核层之间,而Android采用了Apache Licence2.0协议发布,Apache Licence2.0协议并未要求使用基于Apache Licence2.0协议的源代码的软件也必须开源。由于HAL属于Android的一部分,自然也不必开源了。当然加入HAL还有其他目的:统一硬件的调用接口;针对一些特殊的要求。
HAL的架构由最开始到现在有了很大的变化,原始的架构暂且不说,新版本的Android系统将HAL架构修改成了如图所示样子。
从上图可以看出,调用HAL模块的代码并不需要直接装载.so文件,而只需通过一个ID来定位相应的.so文件。
AndroidHAL的源代码存储的位置并不固定,一般会存储在Android源代码目录/hardware目录中,其中Android源代码目录/hardware/libhardware_legacy目录用来存储臼HAL架构的源代码文件。新HAL架构的源代码在Android源代码目录/hardwarelibhardware目录中。当然也可以放在Android源代码目录/hardware或其他目录中。最终编译生成的.so文件主要放在Android系统的/system/lib/hw目录,同样可以放其他目录。
通过上面的介绍对HAL已经有了大概的了解,那么该怎么编写一款支持HAL的Linux驱动程序呢?
1、编写Linux驱动,如果要为Linux驱动添加HAL,而且想尽量保护敏感数据,Linux驱动的代码要尽量简洁,尽可能将业务逻辑放到HAL Library中。
2、编写HAL Library,这其实就是普通的Linux Library文件,但这类库文件有一个接口。通过HAL_MODULE_INFO_SYM变量实现。Service Library就是通过在这个接口中定义的ID定位HAL Libary的。
3、编写Service Library,这一步其实并不是必须的,但是心的HAL架构要求我们这样做。Service Library也是Linxu Library。这一步比较灵活。Service Library可以是一般的Linux Library,也可以是JNI Library。
以上就是一个支持HAL的Linux驱动程序编写的步骤。
以上是关于Android的硬件抽象层和驱动体系为啥这么弱暴的主要内容,如果未能解决你的问题,请参考以下文章