Android sensor构建
Android6.0 系统内置对传感器的支持达26种,他们分别是:加速度传感器(accelerometer)、磁力传感器(magnetic field)、方向传感器(orientation)、陀螺仪(gyroscope)、环境光照传感器(light)、压力传感器(pressure)、温度传感器(temperature)和距离传感器(proximity)等。
Android实现传感器系统包括以下几个部分:
- java层
- JNI层
- HAL层
- 驱动层
各部分之间架构图如下:

Sensor HAL层接口
Google为Sensor提供了统一的HAL接口,不同的硬件厂商需要根据该接口来实现并完成具体的硬件抽象层。Android中Sensor的HAL接口定义在:
hardware/libhardware/include/hardware/sensors.h
对传感器类型的定义:
1 |
- 传感器模块的定义结构体如下,该接口的定义实际上是对标准的硬件模块hw_module_t的一个扩展,增加了一个
get_sensors_list
函数,用于获取传感器的列表。
1 | struct sensors_module_t { |
- 对任意一个sensor设备都会有一个
sensor_t
结构体,其定义如下:
1 | struct sensor_t { |
- 每个传感器的数据由
sensors_event_t
结构体表示,定义如下,其中,sensor为传感器的标志符,而不同的传感器则采用union方式来表示。
1 | typedef struct sensors_event_t { |
sensors_vec_t
结构体用来表示不同传感器的数据:
1 | typedef struct { |
- Sensor设备结构体
sensors_poll_device_t
,对标准硬件设备hw_device_t
结构体的扩展,主要完成读取底层数据,并将数据存储在struct sensors_poll_device_t
结构体中;poll函数用来获取底层数据,调用时将被阻塞定义如下:
1 | struct sensors_poll_device_t { |
- 控制设备打开/关闭结构体定义如下:
1 | static inline int sensors_open(const struct hw_module_t* module, |
Sensor HAL实现
- 打开设备时序图

- SensorDevice属于JNI层,与HAL进行通信的接口,在JNI层调用了HAL层的
open_sensors()
方法打开设备模块,再调用poll__activate()
对设备使能,然后调用poll__poll
读取数据。