Android 源码分析 - 传感器 - 流程

本文详细解析了Android中传感器服务的创建过程、应用创建过程、监听器的注册与注销、传感器的刷新操作以及事件传递的整个流程。从SensorService到SensorEventQueue,再到SensorEventConnection,深入探讨了每个步骤中的关键方法和交互机制,揭示了Android系统如何高效管理和传递传感器事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务创建过程

  1. SensorService::onFirstRef
    1. SensorDevice::getInstance
      1. new SensorDevice
        1. hw_get_module
        2. sensors_open_1
        3. mSensorModule->get_sensors_list
    2. dev.getSensorList
      1. mSensorModule->get_sensors_list
    3. foreach list
      1. registerSensor(new HardwareSensor)
    4. SensorFusion::getInstance
    5. if (hasGyro)(如果有陀螺仪)
      1. registerVirtualSensor(new RotationVectorSensor)
      2. registerVirtualSensor(new GravitySensor)
      3. registerVirtualSensor(new LinearAccelerationSensor)
      4. registerVirtualSensor(new OrientationSensor)

应用创建过程

  1. SystemSensorManager.SystemSensorManager
    1. nativeClassInit(jni方法)
    2. do
      1. nativeGetNextSensor(jni方法)
        1. SensorManager::getInstance(libgui)
        2. mgr.getSensorList
          1. assertStateLocked
            1. getService(获取SensorService接口代理)
            2. mSensorServer->getSensorList

注册Listener

  • 应用层处理
  1. SensorManager.registerListener
    1. SystemSensorManager.registerListenerImpl
      1. mSensorListeners.get(通过listener查找queue)
      2. if (queue == null)
        1. new SensorEventQueue(一个queue对应一个listener)
          1. BaseEventQueue.BaseEventQueue
            1. nativeInitBaseEventQueue(nativeInitSensorEventQueue)
              1. SensorManager::getInstance
              2. mgr.createEventQueue
                1. mSensorServer->createSensorEventConnection(binder调用)
                  1. new SensorEventQueue
              3. new Receiver
        2. queue.addSensor
          1. enableSensor
            1. nativeEnableSensor
              1. SensorEventQueue::enableSensor
                1. mSensorEventConnection->enableDisable(binder调用)
        3. mSensorListeners.put
      3. else
        1. queue.addSensor
  • 服务层ISensorServer处理createSensorEventConnection
  1. SensorService::createSensorEventConnection
    1. new SensorEventConnection
      1. SensorDevice::getInstance
      2. new BitTube(内部包含BitTube)
  • 服务层ISensorEventConnection处理enableDisable
  1. SensorService::SensorEventConnection::enableDisable
    1. mService->enable(SensorService::enable)
      1. if (rec == 0)(没有对应该传感器的记录)
        1. new SensorRecord(connection)
      2. else
        1. rec->addConnection
        2. if (sensor MinDelay == 0)(不是一个连续事件传感器)
          1. connection->sendEvents(发送最后一次的值)
      3. connection->addSensor
      4. sensor->batch(HardwareSensor::batch,先调用batch)
        1. mSensorDevice.batch
      5. connection->setFirstFlushPending(只有该连接等待flush完成事件)
      6. sensor->flush(再调用flush)
      7. sensor->activate(再调用activate)
        1. mSensorDevice.activate

        通过setFirstFlushPending机制,过滤enable时硬件缓存中的事件。

        也有可能是虚拟传感器,其batch方法只会调用setDelay,而setDelay,active方法会调用硬件传感器对应的方法。

注销Listener

  • 应用层处理
  1. SensorManager.unregisterListener
    1. SystemSensorManager.unregisterListenerImpl
      1. mSensorListeners.get
      2. queue.removeSensor(BaseEventQueue)
        1. disableSensor
          1. nativeDisableSensor
            1. mSensorListeners.remove
                1. SensorEventQueue::disableSensor
                  1. mSensorEventConnection->enableDisable(binder调用)

  • 服务层ISensorEventConnection处理enableDisable
  1. SensorService::SensorEventConnection::enableDisable
    1. mService->disable(SensorService::disable)
      1. cleanupWithoutDisableLocked
        1. connection->removeSensor
      2. sensor->activate
        1. mSensorDevice.activate

刷新flush

  • 应用层处理
  1. SensorManager.flush
    1. SystemSensorManager.flushImpl
      1. nativeFlushSensor
        1. SensorEventQueue::flush(libgui)
          1. mSensorEventConnection->flush(binder调用)
  • 服务层处理
  1. SensorService::SensorEventConnection::flush
    1. foreach mSensorInfo(所有关注的传感器同时flush)
      1. if (halVersion < SENSORS_DEVICE_API_VERSION_1_1 || isVirtualSensor)
        1. flushInfo.mPendingFlushEventsToSend++(模拟一个flush完成事件)
      2. else
        1. mService->flushSensor(SensorService::flushSensor)
          1. sensor->flush(HardwareSensor::flush)
            1. mSensorDevice.flush(SensorDevice::flush)
              1. mSensorDevice->flush(sensors_poll_device_1_t)

        注意:应用也可能收到其他应用调用硬件flush引起的flush完成事件。

 事件传递

  • 服务层获取发送事件
  1. SensorService::threadLoop
    1. SensorDevice::getInstance
    2. device.poll
    3. recordLastValue
    4. if (fusion.isEnabled())
      1. fusion.process(处理所有的事件)
      2. 虚拟传感器处理事件,生成新的事件
    5. foreach mActiveConnections(每个活动的连接,都发送事件)
      1. connection->sendEvents
        1. 连接自己过滤事件
          1. 不是自己关注的传感器事件,跳过
          2. 对该传感器处于flush等待状态,跳过
        2. foreach mSensorInfo(发送等待的flush完成事件)
          1. while (flushInfo.mPendingFlushEventsToSend > 0)
            1. SensorEventQueue::write(发送flush完成事件)
          2. SensorEventQueue::write
          3. if (size == -EAGAIN)(发送阻塞,丢弃非flush完成事件)
            1. countFlushCompleteEventsLocked(统计flush完成事件)
      2. cleanupAutoDisabledSensor
        1. foreach events(所有事件)
          1. if (type == SENSOR_TYPE_SIGNIFICANT_MOTION)(特定类型)
            1. if (connection->hasSensor)(连接关注该事件对应的传感器)
              1. sensor->autoDisable
                1. SensorDevice::autoDisable
              2. cleanupWithoutDisable
  • 应用层回调Listener
  1. Receiver.handleEvent
    1. SensorEventQueue::read(读取多个事件)
    2. for events(一个事件调用一次回调)
      1. env->CallVoidMethod(SensorEventQueue::dispatchSensorEvent)
        1. System.arraycopy(只拷贝实际矢量长度)
        2. 该传感器精度变化或者第一个事件
          1. mListener.onAccuracyChanged
        3. mListener.onSensorChanged

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值