Android硬件抽象层(HAL层)学习计划

Android的系统非常复杂和庞大,底层以Linux为基础,上层采用带有虚拟机的JAVA层,通过JNI技术,将上下层打通。我们通常在网上看到的都是官方给出的经典四层架构图。从上到下分别是应用程序层、应用框架层、系统库和运行时库,Linux内核。但是我这里给出的图示多了一层为HAL层(硬件抽象层),这一层主要作用是对硬件设备的具体实现加以抽象.

图1 Android 5层架构图


Android启动图示:


图2:Android开机启动流程

第一步:手机开机后,引导芯片启动,引导程序到RAM,bootloader检查RAM,初始化硬件等参数

第二步:硬件等参数初始化完成后,进入到Kernel层,Kernel层主要加载一些硬件设备驱动,初始化进程管理等操作

第三步:Kernel层加载完毕后,硬件设备驱动与HAL层进行交互。初始化进程管理等操作会启动INIT进程 ,这些在Native层中

第四步:init进程(是所有进程的鼻祖,第一个启动)启动后,会启动adbd,logd等用户守护进程,并且会启动service Manager等重要服务,同时记载zygote进程,这里属于C++ Framework,代码为C++程序

第五步:zygote是init进程解析init.rc文件后fork生成,它会加载虚拟机,启动System Server;System Server负责启动和管理整个Java sFramework

第六步:zygote同时会启动相关的APP进程,它启动的第一个APP进程为Launcher,然后启动Email,SMS等进程,所有的APP进程都有zygote fork生成。

至此,Android系统加载完成。

接下来将根据图2的Android开机启动流程,一步步的进行分析和学习,Bootloader本段学习过程不做描述,这涉及到各个设备厂商的相关核心代码。所以我接下来会从Kernel一步步的往上分析,但是由于Kernel的技术内容太多,涉及面很广,因此深入阐述的地方还要待以后进一步挖掘。

下面先开始硬件抽象层(HAL层)的学习,部分知识点参考了老罗(罗升阳)的技术博客。

我们先想一下为什么要有Android硬件抽象层,我们直接从Kernel提供内核代码给libraries使用不也可以吗?Linux内核源码版权需要遵循GNU License,在产品发布时,需要公布源码,而Android源码遵循Apache License,无需公布源码,为么不损害设备厂商的利益,Android设计出了HAL层,把对硬件的支持抽象成为 硬件抽象层和内核驱动层,内核驱动层只提供简单的访问逻辑,具体的实现都放在硬件抽象层中来实现。

图3 硬件抽象层

俗话说,站在巨人的肩膀上,看的更远,因此我参考老罗的之前的学习内容,也把HAL层的学习计划做了相应的调整,细节如下:

(1)在Android内核中编写驱动
(2)C空间增加可执行程序访问硬件驱动
(3)HAL层访问Linux内核驱动程序
(4)HAL层写JNI方法提供Framwok访问接口
(5)Framework提供访问接口访问硬件
(6)JAVA层APP通过Framework接口访问硬件服务

Tianger Ge wechat
如果您喜欢这篇文章,欢迎扫一扫我的微信公众号!