最近在看Sensor相关的东西,发现看了很多,没有很细致的流程介绍
下面把自己的跟的流程写下来,方便需要的兄弟。
基于:MT6737-N
1.app入口
从registerListener 跟到alps/frameworks/base/core/java/android/hardware/SensorManager.java
public abstract class SensorManager 发现是个抽象类 那么搜下类继承的地方
2.framework
实现registerListenerImpl的地方
alps/frameworks/base/core/java/android/hardware/SystemSensorManager.java
这个主要做了两个事情
a.queue = new SensorEventQueue
b.queue.addSensor
很关键的是a 这个会让你理解 类ISensorEventConnection下的enableDisable方法 这个后面回答是怎么回事。
我们来看queue = new SensorEventQueue
SensorEventQueue继承的是BaseEventQueue这个类 进去看看
构成函数一开始调用了nativeInitBaseEventQueue
我们先找下这个nativer方法实现的地方
alps/frameworks/base/core/jni/android_hardware_SensorManager.cpp
sp<SensorEventQueue> queue(mgr->createEventQueue(clientName, mode));
这句按我的理解 sensorManager->createEventQueue()
我们跳转看下
alps\frameworks\native\libs\gui\SensorManager.cpp
这个关键点在于queue = new SensorEventQueue(connection); 在这里初始化了SensorEventQueue,点进去看下
这句我的理解是传入参数 mSensorEventConnection = connection 剩下的几个参数不关注,
那这个connection 是哪里传来的
alps\frameworks\native\libs\gui\SensorManager.cpp
点进去看下 alps\frameworks\native\include\gui\ISensorServer.h
什么也没有实现,看来这个应该是binder的client端
DECLARE_META_INTERFACE(SensorServer); 声明了client
接下来直接搜声明binder对应的实现声明 这么搜META_INTERFACE(SensorServer
也可以定位到alps/frameworks/native/libs/gui/ISensorServer.cpp 这个
进去看下
真正的client端出现了
BpSensorServer
那么服务端怎么搜,我是这样搜BnSensorServer,不知道还有没其他更好的方法,希望知道的指点下小弟。
alps\frameworks\native\services\sensorservice\SensorService.h
原来实现方法都在SensorService这个类中
alps\frameworks\native\services\sensorservice\SensorService.cpp
到这里刚刚完
a.queue = new SensorEventQueue
接下我们来看b
alps/frameworks/base/core/java/android/hardware/SystemSensorManager.java
queue.addSensor 点进去看下
还是native方法
alps\frameworks\base\core\jni\android_hardware_SensorManager.cpp
我们看下
getSensorEventQueue()取的是什么
还是 SensorEventQueue
alps\frameworks\native\libs\gui\SensorEventQueue.cpp
这个在a时候分析过了mSensorEventConnection = connection
看下上面分析参数实在
alps\frameworks\native\services\sensorservice\SensorService.cpp实现
createSensorEventConnection
sp<SensorEventConnection> result(new SensorEventConnection(this, uid, packageName,
mSensorEventConnection 就是new SensorEventConnection 的返回值。
alps\frameworks\native\services\sensorservice\SensorEventConnection.cpp
enable 点进去看下还是到了
alps\frameworks\native\services\sensorservice\SensorService.cpp
我们可以这么认为,sensor操作基本是在这个文件进行。
而sensor真正的使能的是
status_t SensorService::enable 函数下的这句
err = sensor->activate(connection.get(), true);
3.HAL
alps\frameworks\native\services\sensorservice\SensorInterface.h
alps\frameworks\native\services\sensorservice\SensorInterface.cpp
mSensorDevice在哪里赋值的
mSensorDevice(SensorDevice::getInstance()) 这里赋值
我们搜下SensorDevice
alps\frameworks\native\services\sensorservice\SensorDevice.cpp
SensorDevice::getInstance() 应该走的是构造函数
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID,
(hw_module_t const**)&mSensorModule);
这个是JNI和HAL 的桥梁,根据SENSORS_HARDWARE_MODULE_ID这个id进行关联
err = sensors_open_1(&mSensorModule->common, &mSensorDevice);
这个应该是打开并赋值mSensorDevice
好了我们搜下SENSORS_HARDWARE_MODULE_ID
alps\vendor\mediatek\proprietary\hardware\sensor\sensors.c
open
init_nusensors
alps\vendor\mediatek\proprietary\hardware\sensor\nusensors.cpp
dev = new sensors_poll_context_t(); 看下这个到底做了什么
初始化设备对应的操作方法。
我们关注mSensors[temperature] = new TempratureSensor();
alps\vendor\mediatek\proprietary\hardware\sensor\Temprature.cpp
并没有看到activate 相关方法
回到alps\vendor\mediatek\proprietary\hardware\sensor\nusensors.cpp
poll__activate
这里才是使能地方
回到alps\vendor\mediatek\proprietary\hardware\sensor\Temprature.cpp
enable
这个才是它的节点,写1为使能路径 /sys/class/misc/m_temp_misc/tempactive
4.Kernel
不往下跟了,kernel部分这个机子没有温度传感器,其他kernel跟其他也很简单,在kernel搜下节点名字就可以出来了
节点的store和show函数都有了,这个是MTK框架,往框架上添加相应的驱动即可。