分享

Android Sensor流程

 开花结果 2022-05-26 发布于北京

一.首先看一下sensor的整体架构:

第一层是应用层:代表上层使用frameworks的接口注册或使用一个sensor:

第二层Frameworks层: 包含SensorService, 接收HAl层传上来的 sensor event 数据,并让应用层做出相应的动作,如陀螺仪转动,横竖屏切换等

第三层HAL层: kernel层的硬件驱动等, 有SensorDevice 的poll函数读取数据

二.分析SensorServier 的启动流程:

在android系统中每一个功能点都是由Service来调度, 如熟知的ActivityManagerService, PackageManagerService等等, 这些我会在以后的博客中逐个分析

先看调用时序图

SystemServer中唯一的一个JNI调用启动SensorService

SystemServer.java :

 com_android_server_SystemServer.cpp:

  使用Binder机制将SensorService启动。

 SensorService的初始化:

Service的初始在SensorService::onFirstRef函数中

 SensorService的初始化主要有:

1. 创建SensorDevice实例,获取Sensor列表

2. 调用SensorDevice.getSensorList(),获取Sensor模块所有传感器列表并为为每个传感器注册监听器

SensorDevice的初始化:

 

SensorService 及SensorDevice的启动主要实现一下几件事:

1. 调用HAL层的hw_get_modele()方法,加载Sensor模块so文件

2. 调用sensor.h的sensors_open方法打开设备

3. 调用sensors_poll_device_t->activate()对Sensor模块使能

启动一个线程,获取HAL层的数据:

SensorService::threadLoop():

进入while循环, 不停的从底层poll数据, 并sendEvent到上层

三. 客户端与服务端之间Sensor数据传递

先看服务器与客户端状态图:

1. 上图涉及两个线程:

橘黄色服务端: SensorService::threadLoop 它通过SensorDevice::poll 不停的从HAL获取数据

蓝色客户端:android_hardware_SensorManager::Receiver 从EventQueue中读数据

2. 传递数据是的一个关键宏:sensors_event_t

4. 使用管道传递数据的原因是由于sensor数据量较大, Binder不能胜任此任务, 所以需要BitTube管道来传递这些数据

5. 数据时序图:

根据图示可以看出客户端与服务端通过Binder建立链接, 通过BitTube管道进行数据传递。

BitTube init函数:

1. 使用socket[0] 来接收数据

2. 使用socket[1] 来发送数据

3.通过pipe(fds)创建管道,通过fcntl来设置操作管道的方式,设置通道两端的操作方式为O_NONBLOCK ,非阻塞IO方式,read或write调用返回-1和EAGAIN错误。


原文链接:https://blog.csdn.net/beifengfoguo/article/details/50896263

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多