mSensorServer是对ISensorServer对象的强引用,在SensorManager初始化时通过getService()方法在ServiceManager中查找“sensorservice”对应的服务,并赋值给mSensorServer。由第4小节可知,ServiceManager中返回的就是SensorService实例。从SensorService的类图也能看出,SensorService是ISensorServer的子类。
CreateSensorEventConnection()方法创建了一个SensorEventConnection对象,并将该对象的强引用返回给SensorManager。
SensorEventConnection是SensorService的内部类,该类在构造时主要进行了一些初始化参数列表工作,其中最主要的操作是new BitTube(),创建完成后,SensorEventConnection中会保存一个对BitTube对象的强引用。
BitTube是一个字节管道,可以在进程间进行数据传递。在构造BiTube对象时,首先创建一对匿名的、互相连接的Unix域套接字,然后将用于数据接收的Socket赋给mReciveFd,将用于数据发送的Socket赋给mSensorFd。
现在SensorService中的这部分工作已经完成,mSensorEventConnection中保存了对BitTube对象的强引用,SensorManager保存了对mSensorEventConnection的强引用。接着SensorManager将mSensorEventConnection作为参数构造SensorEventQueue对象。
SensorEventQueue的构造函数中主要工作是初始化mRecBuffer数组,其中ASensorEvent结构体定义与hardware/sensors.h中sensors_event_t结构体完全一致。
由于SensorManager中生成的是SensorEventQueue的强引用,onFirstRef()函数会被调用。该函数的执行结果就是得到了mSensorEventConnection中保存的mBitTube对象引用。
由此,createSensorEventQueue()函数执行完成后,mSensorEventConnection中保存了mBitTube的引用,mSensorEventQueue中保存了mSensorEventConnection和mBitTube的引用。
再返回到JNI部分,现在nativeInitSensorEventQueue中获得了mSensorEventQueue
对
象
的
引
用
,
然
后
通
过
调
用
android_os_MessageQueue_getMessageQueue()得到一个MessageQueue对象的引用,利用mSensorEventQueue和mMessageQueue,以及Java层SensorEventQueue对象来构造Receiver类实例。
Receiver负责监听服务端事件,并将事件回调给Java层SensorEventQueue进行分发。事件监听的文件描述符及回调接口在onFirstRef函数中指定。mSensorQueue->getFd()中返回的是mBitTube中的mReceiveFd,this指定了监听到事件时的回调对象,当消息队列监听到mReceiveFd中有事件产生时,就会回调this->handleEvent()方法对事件进行处理。
handleEvent函数会对数据进行分类,最后回调Java层SensorEventQueue中的dispatchSensorEvent方法把数据分发到对应的SensorEventListener对象进行处理。至此,第一步new SensorEventQueue()完成。
第二步调用addSensor()方法启用传感器。首先从mActiveSensors中检查该传感器是否已激活,如果已激活则返回false。但是,mActiveSensors是BaseEventQueue的成员变量,不是SystemSensorManager的全局变量,每一个BaseEventQueue对象都对应一个mActiveSensors。考虑到一个BaseEventQueue
只能对应一个SensorEventListener,所以除非是mListener和Sensor对象都相同才会返回false,否则不管是同一种传感器注册了另一个Listener对象,还是同一个Listener注册到另一种传感器上,都会继续执行enableSensor。
enableSensor()会调用JNI层的nativeEnableSensor()函数,然后依次调用SensorEventQueue—> SensorEventConnection中的enableDisable()函数,由于注册Listener时是启用传感器,所以会执行SensorService的enable()函数,同时SensorEventConnection会将自身作为参数传递给enable()函数。
enable()函数会首先检查要启用的传感器是否已处于激活状态,如果未激活,则创建SensorRecord对象,用于管理连接到该类型传感器的SensorEventConnection对象。创建完成后将SensorEventConnection对象保存到其中,同时将该传感器handle和SensorRecord对象添加到mActiveSensors中。如果已激活,则只将mConnection添加到SensorRecord中,如果该传感器数据上报类型为ON_CHANGE,则立即将上一次得到的数据通过新mConnection上报。Sensor激活状态检查完成后,将要启用的Sensor Handle保存到mConnection中,用于标识该通道可以传递哪些类型传感器的数据,然后将该mConnection添加到mActivieConnection中。最后调用activate方法激活该传感器。
sensor是指向SensorInterface类实例的指针,不管是HardwareSensor,还是GravitySensor、OrientationSensor等Virtual Sensor都是其子类,这些子类的activate()方法最终都通过SensorDevice::activate()方法与HAL层Sensors.cpp中的sensors_poll_context_t::activate()进行关联。不同之处在于HardwareSensor中直接调用SensorDevice::activate()激活对应类型传感器,而Virtual Sensor是通过SensorFusion::activate()间接调用,并且会同时激活Acc、Mag、Gyro三种传感器。
7. onSensorChange
SensorService的主线程开始运行后,会通过poll()方法不断从HAL层获取数据,当获取到数据后,通过相应的SensorEventConnection对象写入到共享内存区域BitTube中,MessageQueue中会监听接收端mReceiverFd的事件,当有事件写入时,会将事件取出并回调Receiver::handleEvent()方法,接着通过JNI机制回调Java层SystemSensorManager进行处理。
的内部类SensorEventQueue
中的
dispatchSensorEvent()方法,该方法最终将数据分发给对应的SensorEventListener
7.1 SensorService::threadLoop()
SensorService启动后,threadLoop()函数不断循环等待HAL层上报的数据。
mSensorDevice在SensoerDevice类对象构造时通过open_sensor_1()函数进行初始化,Qcom Sensor HAL中该方法的最终实现是在sensors.cpp的open_sensors()函数。在open_sensors()中,函数指针poll被赋值为poll__poll()函数的地址。
DataTransfer.jpg
poll__poll()函数体内就是调用sensor_poll_context_t::pollEvents()函数,pollEvents()会依次查看每个传感器是否有事件产生,若有则通过NativeSensorManager::readEvents()方法读取事件。遍历完全部传感器并读取到了事件,或者未遍历完全部传感器但已读取到指定数量的事件,都会将事件返回给
相关推荐: