安卓驱动程序架构

时间:2022-07-05 19:39:32

我们回忆上一篇文章的两种驱动模型

第一种驱动模型当中是内核级别的驱动程序,还会有个APP

我们驱动程序提供出来的接口是ioctl接口,我们APP采用的是JAVA语言编写的,但是我们JAVA语言是没有IOCTL这个函数的

既然没有,怎么链接到我们底层的ioctl呢,所以这里要引入第三方,用JAVA语言写的APP调用到我们C和C++编写的程序,用JNI就可以调用

JNI是JAVA NATIVE INTERFACE:即JAVA本地接口,它提供了JAVA程序调用C/C++程序的机制,为什么JAVA语言已经成熟了还要去调用C/C++的库呢

1.处于对代码的保护。由于JAVA代码很容易被反编译,而C/C++库反汇编难度较大

2.可以方便的使用现存的开源库。大部分开源库都是用C/C++代码编写的

3.提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率

4.JAVA代码在某些文件操作方面,找不到相应的API

这里又有一个疑问,我们在用第一种驱动模型的时候直接弄的一个APP,没有看到第三方的程序啊。因为我们在这个技术当中用到了另外一个技术叫做NDK技术

在安卓首次发布的时候,Google就宣布其支持JNI编程,但是使用C/C++开发so库文件如何和一个应用程序一起打包成APK并发布?这里就还存在技术障碍

NDK(Native Development Kit)提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和JAVA应用一起打包成APK(安卓特有技术)

APK是AndroidPackage即Android安装包(apk) 通过将APK文件直接传到Android模拟器或Android手机中执行即可安装

这就是我们第一种模型,但是为什么还要讲第二种模型,第一种模型肯定有不好的地方,它最大的问题在驱动这一块,我们驱动是遵循GPL协议的,GPL需要开源,比如说我是一个厂商,我的驱动程序里有很多我的商业的秘密,我不想开源。那么就出问题了,你这个驱动程序在内核当中就一定要开源,那么我就把你这驱动程序一份为2,有一部分是开源的,遵循我GPL协议的,有一部分就不开源,不开源的部分就不能放到内核里面了,那么你肯定要把它放到安卓里面去。这个基本思路就是这样,我们看一看是怎么做的

我们模型二就出来了,我们模型二首先还是还是我们内核的驱动,往上是我们把不想开源的代码放到了我们安卓系统当中去了,而且我们给了它一个新的名字叫做HAL,硬件抽象层。我们HAL里面就是放了不想开源的代码。然后在HAL之上就是硬件服务层,我们把我们的硬件抽象层就行一个相应的封装,封装出一个硬件服务,注意每一个驱动会对应一个硬件服务,我们会把硬件服务注册到安卓系统当作去,然后我的APP要去调用我们驱动程序怎么做的呢???我们APP首先是用过在安卓系统中很重要的一个部分叫做service  manage 我们APP首先通过service manage找到硬件服务,然后通过硬件服务一层一层的调用下去。这才是比较规范的。

那么这个过程中,驱动工程师要做的是1.最底层的驱动开发 2.硬件抽象层也要我们开发 3.硬件服务也需要我们去开发,开发完了之后还需要注册到系统当中去。