打印
[资料分享]

安卓底层开发学习经验第二十四期

[复制链接]
815|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这一期我们来看一下Android Sensor的一个整体框架
Android Sensor的框架可以分为下面几层:第一是应用层APP,是给我们手机软件来使用的;中间层是framework层和Hal层,framework层又分为java部分和c++层,我们的java层就是我们的SensorManager,他向上提供接口,对我们的APP进行支撑,向下连接我们的SensorserviceSensorservice主要是向SensorManager提供服务的,向下他又和我们的Hal层连接在了一起,我们sensor中的Hal层他是一套标准的接口,这个SensorHal是一个动态库。每当我们启动Sensorservice的时候,他就会动态的load我们的SensorHal层,根据不同的平台,我们会load不同的动态库。这样我们就能根据我们不同平台的硬件设置来把这些库添加到系统中。让我们的Sensorservice自动匹配我们的Hal层,Hal层又连着我们底层的设备驱动,也就是我们真正的实体的sensor,他会在我们dev/input目录下,生成一系列的设备节点,这些节点就是我们的传感器设备节点,而我们真正和硬件打交道的就是我们的kernel,打交道的方式就是IICSPI加一些时钟,IO的控制,这样我们就能拿到我们所有的传感器的信息。
当我们在应用层获取一个数据时,我们首先会拿到我们的SensorManager,然后向他注册一个监听Sensor的接口,这样我们的SensorManager就会和Sensorservice建立通讯。我们Sensorservice把收到的sensor信息发给SensorManager,然后SensorManager通过一系列的回调接口,通知我们的上层应用,这样上层的应用就能拿到sensor的具体数值,这些数值是经过我们Android系统经过处理的数值。我们Sensorservice初始化的时候,他会挂接上我们所有的传感器设备,我们传感器设备发出来的值是自己的一套值,他需要经过我们Android系统的一些转化,才能够被我们系统进行识别。而我们拿到识**的数据,就会根据上层监听的个数来向这些接口发送数据,这样我们每一个应用都可以获取sensor的数据,这个就是Android Sensor的一个总体的框架。
下面我们来看一下这些主要层别的作用:
首先我们来看一下Android SensorManager:他负责初始化并连接Sensorserversensorserver并不是由SensorManager初始化的,它是由systemserver进行初始化的,我们的SensorManager只是负责连接上我们的sensorservice;第二个是对我们的上层应用提供服务的,想要获取Sensor的服务的时候,我们必须调用getservice SensorManager才能够拿到SensorserviceManager这个对象,然后使用这个对象中的一些方法,去获取Sensor的类型和数据,我们获取Sensor数据就是设置一个监听接口,然后重载我们SensorManager的一些方法,这样我们就能获取到底层发过来的数据了,然后我们通过上层来处理Sensor传感器的数据,转化成Android可以识别的数据格式。
然后我们来看一下Android SensorService:它主要是用来动态的加载我们Hal层的库,初始化Hal层,然后通过Hal层打开我们底层的传感器设备,并且把我们的Sensorservice添加到servicemanager中,这样的话我们的SensorManager才能获取到Sensorservice这个服务,之后我们就可以调用Sensorservice的一些方法,去拿到底层的Sensor。我们Sensorservice的作用就是抓取底层的数据,并且根据上层的需要把数据转发出去,这些就是Sensorservice的作用。
最后我们来看一下Android SensorHal层:它主要是对上提供一套标准的接口,对下也是一套标准的接口,这样我们的SensorHal其实就是一层中间间的过程。这样的话我们的上层和底层的接口都是不用变化的,如果有修改只需要把Hal层修改一下即可,重新打包生成静态库,这样就可以把我们的修改做到最小化,我们向上停工的接口就是打开、读取数据、关闭、stop等的一些操作,对下就是读取数据,使用per来拿到底层的数据。第二个就是打开Sensor设备,并且使用驱动所提供的接口来获取Sensor中的数据。
下面我们来看一下我们整个Sensor处理过程是如何来进行的,我们来看一下简单地示意图:
首先我们第一步是当我们系统启动的时候,systemserver这个服务会做一个nativeinit,做这个的目的就是为了初始化Sensorservice,当Sensorservice建立起来之后,他会在后面把Sensorservice添加到servicemanger中,这样我们servicemanger就会有一个Sensorservice的服务,这样就给其他的服务和应用调用这个服务提供了可能性。当我们Sensorservice初始化的时候,他就会把我们的设备全都打开,打开的过程中还会涉及到SensorDevice这样一个结构,它是用来保存我们Hal层的一个操作级,包括openfalseclosePoll等,而我们的Hal层就是真正的打开我们的设备,和底层去做交互。另一个是当我们系统启动的时候会有一个SensorManger,这个也是在system初始化的时候把我们的SensorManger初始化起来,并且把我们的sensormanger也添加到我们的servicemanger中,在我们SensorManger初始化的过程中,我们会和SensorService建立联系,这样他们两个就能进行通讯和交互了。SensorManger分为两层:一个是我们的java部分,另一个是JNI部分。他们使用的通讯机制就是ServiceMangerBender的机制。而我们上层应用获取Sensor的方法就是通过Bender的机制,来获取我们的SensorManger,我们来看一下绿线,首先会通过Bender机制在我们的ServiceManger中获取SensorManger服务,然后通过一系列的调用,获取到我们Sensorservice的数据,这样的话我们的应用就可以拿到这些数据来做一些自己的处理。在实际开发中,我们所涉及到的主要工作一个是我们Sensor的驱动移植,第二个我们需要修改SensorHal层的一些操作,第三是我们Sensorservice服务中也需要根据我们底层的一些修改,而在上层做一些修改,来对我们底层的设备进行支持,这些就是我们在开发中遇到的问题,后面的问题是我们Sensor的一些数据问题,包括精度等问题,是需要我们和我们的技术支持来一起完成的。这一期的内容就到这里了。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

315

帖子

16

粉丝