Android SensorService分析

一、SensorService初始化

  1. systemserver初始化的时候,就会初始化sensorService;

  1. sensorService创建sensorDevice对象,sensorDevice是hal层的操作函数集;

  1. sensorDevice会得到系统所支持sensor的个数和sensor操作函数;

  1. sensorService将系统所支持的sensor添加到sensorlist中;

  1. 根据系统反馈创建虚拟sensor;

  1. 等待连接,启动线程分发数据;

二、SensorServer架构图

三、SensorServer结构图

(1)SensorServer继承了BinderService,BnSensorServer,以及Thread。

(2)当SensorServer初始化的时候,就会调用BinderService的方法,自动的将自己添加到serverManager中,这样sensorManager才能够通过serverManager得到sensorService。

(3)SensorServer在初始化过程中,首先它会调用SensorDevice的一个类,这个类会实例化一个对象,当对象初始化的时候会动态的加载Hal的库,而加载的方法就是hw_get_module(),通过这个方法就能够得到系统默认的sensor的库(libsensor.so),而这个sensor库就是提供底层操作函数集的库。然后会得到一系列sensor的结构,最终会在这个sensor_module_methods拿到open_sensors()。当SensorDevice初始化的时候会调用open_sensors(),open_sensors()就会返回hal层对sensor具体操作的函数,也就是poll(),close(),activate(),setDelay()这四个函数,而poll()函数结果就会返回给mSensorDevice。

(4)当调用SensorDevice对象中的一些方法的时候,比如:getSensorList的时候,mSensorDevice就会将底层所支持sensor个数返回给sensorService,然后sensorService将我们底层所支持的sensor保存到我们的msensorList中,这样sensorService就能拿到底层所有的物理sensor。

(5)如果说我们支持陀螺仪,但是上面不支持a_sensor或g_sensor,我们会通过这个sensor的具体的类型添加到虚拟sensor,并将虚拟sensor添加到mVirtualSensorList中,这样sensorSevice就完成了初始化,但是sensorService初始化的时候就会启动threadLoop。

(6)剩下的工作sensorService就是用来监听sensorManager对sensorService的链接情况,如果说sensorManager连接了sensorServices,这个时候我们会通过sensorService提供的一个方法来创建一对无名的又无链接的unit套接字,这样sensorManager就会和sensorService建立连接,就可以使用这对unit套接字进行通信,数据交互。

(7)threadLoop()继承了Thread,它调用mSensorDevice中的poll()方法,将底层的数据不断地获取,获取完以后然后通过sendEvents()发送给sensorManager,然后sensorManager向上发送给app,这样app就能拿到数据应用。

四、SensorServer过程

在frameworks/base/services/java/com/android/server/SystemServer.java的main()函数中会有一个nativeInit()方法,对系统服务进行初始化,同时初始化sensorServer。

sensorServer的定义,继承下面的三个类

将sensorServer添加到serverManager中,所以在初始化的时候就已经将sensorserver添加到服务列表中。

(1)首先sensorServer会调用OnFirstRef()实例化一个对象sensorDevice()。

(2)进入到hal层得到模块(sensor,camera,audio等),id就是模块字符串,module就是操作集的句柄,返回值给sensorDevice。

路径处理

环境变量定义

得到环境变量值,将赋值给prop中,然后将sensor的动态库路径赋值给path。

动态库路径

如果动态库文件存在,跳出循环

然后load动态库,并返回状态

调用dlsym()得到动态库中操作函数集的句柄

将函数操作集的句柄返回出去给hw_get_module(),这样sensordevice就能对底层sensor函数操作。

拿到函数操作集就能打开sensor,调用sensors_open_1()打开sensor,对hal进行初始化。

上面hal层就初始化完成了,然后调用get_sensors_list得到底层也就是hal层所支持的sensor类型。

然后将sensor类型添加到mActivationCount中,并且调用activate()将设备激活。这样sensordevice就初始化完成了。

调用对象dev拿到所有的sensor类型

利用循环,调用registersensor()将拿到的所有sensor添加到sensor列表中。

当所有的sensor注册完以后,sensorservice就初始化完成。

五、sensorservice和hal的对接挂载过程

六、数据请求处理

当上层App请求过来时,也就是sensorManager请求sensorServer时,会创建一个connection,connection会创建一个没有连接的套接字mChannel,这样sensorManager就能和sensorServer进行交互通信,数据走的是socket套接字,命令走的是。

七、sensorManager使能sensorServer

sensorManager中有一个enable()方法,sensorServic中这个enable()就是将上层监听的sensor激活

这个enable()就是将上层监听的sensor激活

猜你喜欢

转载自blog.csdn.net/weixin_41734758/article/details/128998425
今日推荐