Android SensorService源码分析(一)

最近收到任务,要把陀螺仪的数据对接到上层,分发应用。就赶紧看了一下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++)="" {<=
  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值