Android Sensor简介

1/9/2022 Sensor

# 一、Android主要sensor类型(手机常用的加下划线)

加速度传感器磁感应传感器、方向传感器、陀螺仪光线传感器、压力传感器、温度传感器、距离传感器重力传感器线性加速度传感器、翻转传感器、相对湿度传感器、其他传感器

# 加速度传感器

测试设备重力情况,相对于外部参照物

作用:可以获取三个轴的数据

原理:使加速度传感器内部产生形变,输出三个与之相对应的电压信号

应用场景:摇一摇,游戏控制等

其他:手机平放时,Z轴会有一个9.8的加速度值,为地球引力加速度值(有些厂商会屏蔽该值)

# 磁感应传感器

定位设备的方位,可以测量出当前设备与东南西北四个方向上的夹角

作用:获取磁场变化

数据:x,y,z三个方向

应用:指南针,定位设备的方位

# 陀螺仪

测量设备自身的旋转运动。对设备自身运动更擅长。但不能确定设备的方位。

原理:角动量守恒,中间有一个陀螺,周围三个轴的定位组建,根据旋转过程给出三个角速度

数据:返回x,y,z三轴的角速度数据

作用:游戏

# 光感性传感器

自动调整手机屏幕亮度

# 距离传感器

打电话贴近耳朵黑屏

# 压力传感器

# 二、Android Sensor框架

App App
Framework SensorManager
SensorService
Hal SensorHal
Kernel accelerometer, magnetic, gyroscope

# SensorManager

  1. 初始化并连接SensorService(SystemServer初始化时创建)

  2. 对应用层提供接口,获取sensor类型和sensor数据

  3. 处理sensor传感器数据,转化成android可以识别的数据格式

# SensorService

  1. 根据平台动态加载hal层的库,初始化hal层

  2. 抓取底层数据根据需要向上转发sensor数据

# SensorHal

  1. 封装底层接口,对上提供统一接口

  2. 打开sensor设备,提供相关操作接口

flow flow

# SensorManager流程

  1. App注册服务(powmanager, sensormanager...)

  2. 得到sensormanager,注册listener

  3. 创建消息队列queue,通过jni和sensorserver建立连接(socket方式)

  4. 接收数据,通过listener回调得到数据

# SensorService初始化流程

  1. SystemServer初始化时,初始化SensorService

  2. SensorService创建SensorDevice对象,SensorDevice时hal层的操作函数集

  3. SensorDevice会得到系统支持sensor的个数及sensor操作接口

  4. SensorServer将系统支持的sensor添加到sensorlist中

  5. 根据系统反馈创建虚拟sensor

  6. 等待连接,启动线程分发数据

sensorservice

# SensorServer导入hal层库流程

  1. 根据系统Prop设置值,在/system/lib/hw找到要加载的库

  2. 使用dlopen动态库文件

  3. 使用dlsym得到并返回sensor的操作函数集

# Android寻找动态库和得到操作句柄的过程

  1. 获取系统prop,查找对应的库 /Path/sensors.prop.so

  2. dlopen打开库文件,使用dlsym获取HMI的hw_module_t句柄

  3. HMI时一个字符串,对应动态库中的一个符号,动态库是一个ELF文件格式

  4. ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况,包括指令、数据、符号表,重定位信息等等

  5. 使用readelf -s sensors.default.so 可以查看动态库符号信息,找到HMI符号

# Android Sensor数据流