一.首先看一下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
|