Android Sensor框架简述(一)
来源:互联网 发布:360淘宝网 编辑:程序博客网 时间:2024/04/18 16:57
Sensor整体框架
什么是Sensor?
Sensor就是所谓的传感器,比如AccelerometerSensor、MagneticSensor、OrientationSensor、ProximitySensor、LightSensor、Gyro等。
黄色部分:硬件,在I2C总线上
红色部分:驱动,驱动注册到Kernel的Input Subsystem
上,然后通过Event Device
把Sensor数据传到HAL层,准确说是HAL从Event读
绿色部分:动态库,它封装了整个Sensor的IPC机制,如SensorManager
是客户端,SensorService
是服务端,而HAL部分是封装了服务端对Kernel的直接访问
蓝色部分就是我们的Framework
和Application
了,JNI负责访问Sensor的客户端,而Application
就是具体的应用程序,用来接收Sensor返回的数据,并处理实现对应的UI效果
SensorService启动
网络上很多sensor机制讲解的内容都是过时的了,新的android有了新的机制,这里讲的是Android5.0以上的版本
这里推荐一个较新的博客,关于Android5.0 Sensor机制 android-5.0 sensor工作原理—sensorservice的启动(一)
启动SensorService的过程如上图所示,过程还是比较清晰的。
SensorDevice获取
SensorService的onFirstRef()函数创建了一个新的SensorDevice,接下来就来看看SensorDevice做了哪些工作。
hw_get_module()
status_t err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, (hw_module_t const**)&mSensorModule);
这个函数主要是为了从的库文件获取参数,第一个参数是所获取的hardware模块的名字,第二个参数是获得的hw_module_t。如何获得的细节不在赘述。
hw_module_t
struct sensors_module_t HAL_MODULE_INFO_SYM = { common:{ tag: HARDWARE_MODULE_TAG, version_major: 1, version_minor: 0, id: SENSORS_HARDWARE_MODULE_ID, name: "SPRD Sensor module", author: "Spreadtrum", methods: &sensors_module_methods, dso: 0, reserved:{}, }, get_sensors_list:sensors__get_sensors_list, }; static struct hw_module_methods_t sensors_module_methods = { open: open_sensors }; static int sensors__get_sensors_list(struct sensors_module_t *module, struct sensor_t const **list) { *list = sSensorList; return numSensors; }
这是一个结构体,包含一个hw_module_t还包含一些接口,比如sensors__get_sensors_list和open_sensors等
sensors_open_1
static inline int sensors_open_1(const struct hw_module_t* module, sensors_poll_device_1_t** device) { return module->methods->open(module, SENSORS_HARDWARE_POLL, (struct hw_device_t**)device); }
这里的open函数就是上一步hw_get_module()
获取的sensors_module_t
所定义的sensors_module_methods
的open_sensors
接口
open_sensors()
static int open_sensors(const struct hw_module_t* module, const char* id, struct hw_device_t** device) { int status = -EINVAL; sensors_poll_context_t *dev = new sensors_poll_context_t(); memset(&dev->device, 0, sizeof(sensors_poll_device_t)); dev->device.common.tag = HARDWARE_DEVICE_TAG; dev->device.common.version = 0; dev->device.common.module = const_cast<hw_module_t*>(module); dev->device.common.close = poll__close; dev->device.activate = poll__activate; dev->device.setDelay = poll__setDelay; dev->device.poll = poll__poll; *device = &dev->device.common; status = 0; return status; }
sensors_poll_context_t()方法新建并初始化系统所有的sensor
然后对sensors_poll_device_t结构体的初始化,以及数据获取的API 接口的定义
get_sensors_list()
这个方法就是上述hw_get_module()获取的sensors_module_t的方法,获取的是HAL层初始化好的sensor的列表,并返回sensor的数量
activate()
最后是一个循环,把所有的sensor都通过activate激活。
调用HAL层sensor厂商添加的setEnable()方法来打开对应sensor。
通过open函数获取sensor在sysfs对应的文件节点,然后使用write函数往文件节点里面写1。
这就是activate的大概过程,代码不再贴出来。
至此,sensor全部启动完毕。
- Android Sensor框架简述(一)
- Android Sensor框架简述(二)
- Android Sensor框架简述(三)
- Android mediaRecorder框架简述(一)
- Android mediaRecorder框架简述(一)
- Android Sensor底层框架
- Android Sensor 框架
- android sensor 框架分析---sensor数据流分析
- android sensor 框架分析---sensor native分析
- android sensor 框架分析---sensor 总结
- Android传感器---Motion Sensor(一)
- Android传感器---Position Sensor(一)
- Android 浅谈Sensor工作流程(一)
- Android Sensor工作流程(一)
- Android传感器---Motion Sensor(一)
- Android传感器---Position Sensor(一)
- android-5.0 sensor框架简介
- android sensor 框架分析---服务端
- postgreSQL中where子句执行顺序 - 多个and从左到右依次执行
- 移动端轮播图
- CSS绘图:环
- String to Integer (atoi)
- 突然接到指令,玩STM32
- Android Sensor框架简述(一)
- mysql排序order by新发现
- bootstrap-datepicker 插件修改为默认中文 - cnhxz
- h5开发中常见的问题汇总
- 带百分比显示的seekbar
- Kintinuous 解析
- Charles 从入门到精通
- 公开的海量数据集 Public Research-Quality Datasets
- Imooc·Java高并发秒杀API(JavaScript模块化)