赞
踩
最近收到任务,要把陀螺仪的数据对接到上层,分发应用。就赶紧看了一下Sensor服务相关的代码。本来是想熟悉之后可以在调试过程中能有的放矢。结果我们这个车载方案有些区别,看的这些东西根本没用上。这里还是整理一下Sensor服务相关的点。
我们的系统可能存在多个传感器,像陀螺仪,加速传感,接近传感,磁力传感器、方向传感等等,Sensor服务需要管理所有传感器,负责他们数据的分发和监听,还有传感融合计算,以及虚拟传感等等。
先还是通过一张图大概了接一下Sensor服务和应用之间的关系。
1 系统进程中 SensorService是一个C++的服务,他启动过程中会加载Sensor Hal层库,激活Sensor硬件。
2 在APP进程Java层可以获取SystemSensorManager对象,这个对象的初始化过程中会对应创建Native层的SensorManager对象。在SensorManager中会通过ServiceManager获取SensorService的代理对象来和SensorService交互。
3 当应用需要监听Sensor数据的时候,会通过SystemSensorManager以及他native层的SensorManager请求SensorService创建一个SensorEventConnection (binder)对象。在SensorEventConnection中还会通过BitTube创建一对Socket。一端用于SensorService从Sensor硬件读取Sensor数据后写入。另一端,用于应用来读取数据,然后分发给监听对象。
4 Receiver就是用于应用这边读取数据然后分发。
接下来就分四个部分两篇文章来对SensorService的源码做个简单的分析:
一: SensorService服务的启动以及Sensor Hal层库的加载和初始化
二: 应用层SystemSensorManager以及native层SensorManager的初始化以及和SensorService建立连接
三: 应用注册Sensor数据监听的过程
四: sensor数据分发的过程
一: SensorService服务的启动以及Sensor Hal层库的加载和初始化
1 开机启动SensorService
SystemService的startBootstrapServices()函数中会调用一个如下的Native函数:startSensorService()
static void android_server_SystemServer_startSensorService(JNIEnv* , jobject) {
char propBuf[PROPERTY_VALUE_MAX];
property_get("system_init.startsensorservice", propBuf, "1");
if (strcmp(propBuf, "1") == 0) {
SensorService::instantiate();
}
}
这个函数就是读取一个属性值,然后比较如果属性值为1,调用SensorService::instantiate()函数。
2 初始化SensorService
SensorService继承自BinderService,BinderService是个模板类,
继承自这个模板类的好处就是把创建Server对象并加入到ServerManager的代码都封装好了。
static void instantiate() { publish(); }
instantiate只是调用了BinderService的publish函数:
template
class BinderService
{
public:
static status_t publish(bool allowIsolated = false) {
spsm(defaultServiceManager());
return sm->addService(
String16(SERVICE::getServiceName()),
new SERVICE(), allowIsolated);
}
SERVICE:去看SensorService的声明你会发现他就是 SensorService
defaultServiceManager: 获取ServiceManager对象。
SERVICE::getServiceName():SensorService加入到ServiceManager的key “sensorservice”
实际上这里就是 new一个SensorService,然后 以 “sensorservice”为key把sensorservice实例加入到ServiceManaer。
3 SensorService 的构造函数并不复杂,主要初始化工作都是在onFirstRef函数中做的
这个函数涉及的东西比较多,这里对重要的部分列出来做一些分析。
void SensorService::onFirstRef(){
//3.1部分
SensorDevice& dev(SensorDevice::getInstance());
......//3.2部分
ssize_t count = dev.getSensorList(&list);
......
for (ssize_t i=0 ; i<count ;="" i++)="" {<=
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。