一、SensorService初始化
systemserver初始化的时候,就会初始化sensorService;
sensorService创建sensorDevice对象,sensorDevice是hal层的操作函数集;
sensorDevice会得到系统所支持sensor的个数和sensor操作函数;
sensorService将系统所支持的sensor添加到sensorlist中;
根据系统反馈创建虚拟sensor;
等待连接,启动线程分发数据;
二、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激活