Android Sensor分析

1 Android Sensor系统框架

Android Sensor系统框架如下:

Android Sensor分析_第1张图片

 图1 Android Sensor系统框架图
(1)SystemServer创建SensorService服务。
(2)之后将SensorService服务添加到ServiceManager里。
注意:ServiceManager管理的是SensorService服务不是SensorManager!
(3)Android app通过SensorManager获取SensorService服务,SensorManager是通过ServiceManager获取的SensorService服务。
(4)hal层SensorDevice封装了底层kernel sensor驱动接口,负责打开和关闭sensor设备等通用操作。

2 SensorManager分析

1 SensorManager作用
(1)连接SensorService
(2)对应用层提供接口,获取sensor类型和sensor数据
(3)处理sensor数据,转化成android可以识别的数据格式
2 App,SensorManager与SensorService交互流程
(1)App注册SensorManager
(2)获取SensorManager实例,注册事件监听器listener,覆写onSensorChanged()接口,监听sensor数据是否有变化
(3)创建消息队列,通过jni和SensorService建立连接(无连接套接字)
注意:SensorManager和SensorService建立连接的方式不是binder,是无连接套接字。
(4)接收hal层数据,通过jni回调java函数将sensor数据回调到framework(SensorManager)
(5)再通过之前App注册的回调函数,将sensor数据回调到App

3 SensorService分析

1 SensorService作用
(1)动态加载hal层的库
(2)抓取底层数据,根据需要向上转发sensor数据
2 SensorService初始化流程
(1)SystemServer初始化时,初始化SensorService
(2)SensorService创建SensorDevice对象,SensorDevice封装了hal层的操作函数集
(3)SensorDevice获取系统支持的sensor个数及sensor操作接口
(4)SensorService将系统支持的sensor添加到sensorList里
(5)等待SensorManager的连接,启动线程(threadLoop)分发数据
3 SensorService导入hal层so流程
(1)在/system/lib/hw下找要加载的库
(2)dlopen加载动态库
(3)dlsym得到sensor的操作函数集

4 SensorHal分析

1 sensors_module_t结构体

struct sensors_module_t HAL_MODULE_INFO_SYM = {
    common : {
        tag: HARDWARE_MODULE_TAG,
        version_major: 1,
               version_minor: 0,
               id: SENSOR_HARDWARE_MODULE_ID,
               name: "Invensense module",
               author: "Invensense Inc.",
               methods: &sensors_module_methods,
               dso: NULL,
               reserved: {0}
    }
};

hal层主要是对fd的操作,打开,关闭,监听events,接收数据。需要Unix系统调用编程比较熟。
2 Android Sensor数据流

Android Sensor分析_第2张图片

图2 Android Sensor数据流
SensorService通过poll()从SensorDevices获取数据,然后通过socket将sensor数据传递给SensorManager(native),SensorManager(native)将收到的sensor数据通过jni传递到SensorManager(java),SensorManager(java)最后将sensor数据传递给App层注册的回调。
注意:SensorManager与SensorService之间数据走的是socket套接字,命令走的是binder!

你可能感兴趣的:([Android]系统,android)