Android 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
初始化并连接SensorService(SystemServer初始化时创建)
对应用层提供接口,获取sensor类型和sensor数据
处理sensor传感器数据,转化成android可以识别的数据格式
# SensorService
根据平台动态加载hal层的库,初始化hal层
抓取底层数据根据需要向上转发sensor数据
# SensorHal
封装底层接口,对上提供统一接口
打开sensor设备,提供相关操作接口
# SensorManager流程
App注册服务(powmanager, sensormanager...)
得到sensormanager,注册listener
创建消息队列queue,通过jni和sensorserver建立连接(socket方式)
接收数据,通过listener回调得到数据
# SensorService初始化流程
SystemServer初始化时,初始化SensorService
SensorService创建SensorDevice对象,SensorDevice时hal层的操作函数集
SensorDevice会得到系统支持sensor的个数及sensor操作接口
SensorServer将系统支持的sensor添加到sensorlist中
根据系统反馈创建虚拟sensor
等待连接,启动线程分发数据
# SensorServer导入hal层库流程
根据系统Prop设置值,在/system/lib/hw找到要加载的库
使用dlopen动态库文件
使用dlsym得到并返回sensor的操作函数集
# Android寻找动态库和得到操作句柄的过程
获取系统prop,查找对应的库 /Path/sensors.prop.so
dlopen打开库文件,使用dlsym获取HMI的hw_module_t句柄
HMI时一个字符串,对应动态库中的一个符号,动态库是一个ELF文件格式
ELF头在文件的开始,保存了路线图(road map),描述了该文件的组织情况,包括指令、数据、符号表,重定位信息等等
使用readelf -s sensors.default.so 可以查看动态库符号信息,找到HMI符号