究竟什么是内核,什么是HAL

什么是内核?
内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础。
它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来,使之常驻内存,并对他们进行保护。通常把这一部分称之为操作系统的内核。

Android系统并不是从零开始设计的,而是搭建在Linux内核之上。狭义的Android系统,主要指的是Linux内核以上的各层。
Linux对于Android最大的价值,便是其强大的可移植性。Linux可以运行在各式各样的芯片架构和硬件环境下,而依托于它的Android系统,也便有了强大的可移植性。
Linux内核本身使用GPL协议,讲其对软件的主要影响,就是基于该软件开发的任何软件,都必须以GPL协议发布。简单的讲就是你使用了这个开源软件,那么你在此基础上开发的东西也得是开源的。(现实社会中,这一协议对中国的开发商约束效力不大,很多厂商根本不开源或是推迟到产品生命周期终结后才开源。)

什么是HAL?
HAL的全称是Hardware Abstraction Layer,即硬件抽象层。
Linux系统本身之所以在设备驱动方面支持很烂事实上也是因为GPL协议的因素,而Android的HAL为了保护一些硬件提供商的知识产权并避开Linux GPL的约束。便把控制硬件的动作都放到了Android HAL中,而Linux驱动仅仅完成一些简单的数据交互动作。

总体来说,Android HAL存在的原因主要有:
1.并不是所有硬件设备都会有Linux kernel的标准接口。
2.由于GPL协议的关系,某些设备制造商并不愿意公开硬件驱动,所以Google用HAL的方式去绕过GPL。
3.针对某些硬件,Android有一些特殊的需求。

这一现状在Android上的表现:
以一个Google的Nexus 系列设备为例,当你需要编译它的Android Open Source Project(以下简称AOSP)ROM时。
首先,你需要下载AOSP源码:https://android.googlesource.com (这部分是开源的)
其次,你需要下载供应商的驱动、HAL库:https://developers.google.com/android/nexus/drivers (这部分是是闭源的)

适配的过程中如何利用它们?
硬件厂商的HAL核心代码基本都是以共享库形式出现的,也就是闭源、只开放编译好的二进制文件。
在制作ROM的时候,这一部分通常被我们照单全收,拿来使用。
而当Android版本更新时,因为厂商提供的旧了,我们可能在其它地方加以修改使其能够继续沿用,
或者是拿其它相同硬件且具有较新版本的机型的文件来拼凑。
至于内核,作为Android系统的基础,在厂商发布的原厂ROM的Android版本和我们正在开发的ROM的Android版本相同时,
有时候我们可以提取厂商的内核沿用,而当我们开发的ROM的Android版本高于或低于厂商发布的原厂ROM的Android版本时,
我们就高度依赖于内核源码了,因为在拥有内核源码的情况下,我们可以试着去升级和修改内核源码使之与Android版本得到匹配。

综上所述它们的重要性,如果没有与当前制作的ROM的Android版本匹配的HAL或内核,大部分情况下,适配就瞎了。
因为这将会导致系统无法实现对硬件的正常调用、控制。其后果就是无法正常引导、各种硬件工作不正常等。