我们都知道android系统实际内核是一个Linux内核。所以android系统和Linux系统的内核实际上是一样的。只不过在Linux内核的上谷歌为了达到定制功能做了一些裁剪和拓展,比如在里面运行ART Java虚拟机,使系统可以运行Java程序。
看到这里可能有点不好理解,什么是内核?什么又是系统?
内核就是硬件调用抽象层,他提供调用硬件的API。包括存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。内核是抽象层,具体实际实现调用硬件的是驱动。
那么什么是系统呢?
借用Window系统的一张图来帮助理解
再来一张adnroid系统的图
我们再来看一下操作系统的定义:操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。
就是说虽然内核已经可以实现存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
但是对于普通用户和开发软件者来说还是太复杂了。所以需要操作系统来封装内核调用和实现用户交互界面。
说完内核与系统,让我们回归到android系统本身。android系统既然是linux内核,那么它与linux系统有什么不一样呢?
1.Android除了Linux内核具备的常用核心驱动外,还增加了自己专有的内核驱动程序,如显示驱动、蓝牙驱动、相机驱动、内存卡驱动、Binder IPC驱动等。
2.另外,Android系统为了保护硬件厂商的知识产权,增加了HAL层,可将驱动具体的实现部分抽取发到HAL中去实现,从而规避了硬件驱动开源的风险,所以android的驱动程序是分为两部分,一部分写入内核中,一部分写入HAL层中。
Android除要实现底层驱动的开发外,还需要根据JNI规则将驱动程序封装为JNI层接口,以达到应用程序(JAVA程序) 可通过JNI来调用内核驱动程序。
3.而且,Linux与android还有应用层软件的差异
Android应用程序是使用java语言写的,不能直接调用C语言实现的系统接口,而Linux系统中可以用C语言调用系统接口来与内核进行通信,于是Android系统中就有了一个叫做JNI的概念,用实现java与C/C++程序之间的信息交互。
(1)Android应用程序访问Android内核驱动程序的方式:
APP—>JNI—>Android内核驱动程序 (JNI可以直接访问内核)
APP—>硬件访问服务—>Android内核驱动程序(硬件访问服务可以提供有限的内核访问)
(2)Linux应用程序访问linux驱动程序的方式
APP(C程序)—> Linux内核驱动程序
APP—>C库—>Linux内核驱动程序