android 上层应用 apk 到 G-sensor driver 的大致流程:
Android HAL层,即硬件抽象层,是Google响应厂家“希望不公开源码”的要求推出的新概念
1,源代码和目标位置
源代码: /hardware/libhardware目录,该目录的目录结构如下:
/hardware/libhardware/hardware.c编译成libhardware.so,目标位置为/system/lib目录
/hardware/libhardware/include/hardware目录下包含如下头文件:
hardware.h 通用硬件模块头文件
copybit.h copybit模块头文件
gralloc.h gralloc模块头文件
lights.h 背光模块头文件
overlay.h overlay模块头文件
qemud.h qemud模块头文件
sensors.h 传感器模块头文件
/hardware/libhardware/modules目录下定义了很多硬件模块
这些硬件模块都编译成xxx.xxx.so,目标位置为/system/lib/hw目录
2,Android
对于
Sensor
的
API
定义在
hardware/libhardware/include/hardware/sensor.h
中
,
要求在
sensor.so
提供以下
8
个
API
函数
[
控制方面
]
int (*open_data_source)(struct sensors_control_device_t *dev);
int (*activate)(struct sensors_control_device_t *dev, int handle, int enabled);
int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms);
int (*wake)(struct sensors_control_device_t *dev);
[
数据方面
]
int (*data_open)(struct sensors_data_device_t *dev, int fd);
int (*data_close)(struct sensors_data_device_t *dev);
int (*poll)(struct sensors_data_device_t *dev, sensors_data_t* data);
[
模块方面
]
int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t const** list);
在
Java
层
Sensor
的状态控制由
SensorService
来负责
,
它的
java
代码和
JNI
代码分别位于
:
frameworks/base/services/java/com/android/server/SensorService.java
frameworks/base/services/jni/com_android_server_SensorService.cpp
在
Java
层
Sensor
的数据控制由
SensorManager
来负责
,
它的
java
代码和
JNI
代码分别位于
:
frameworks/base/core/java/android/hardware/SensorManager.java
frameworks/base/core/jni/android_hardware_SensorManager.cpp
android framework
中与
sensor
通信的是
sensorService.java
和
sensorManager.java
。
sensorService.java
的具体通信是通过
JNI
调用
sensorService.cpp
中的方法实现的。
sensorManager.java
的具体通信是通过
JNI
调用
sensorManager.cpp
中的方法实现的。
sensorService.cpp
和
sensorManger.cpp
通过
hardware.c
与
sensor.so
通信。其中
sensorService.cpp
实现对
sensor
的状态控制,
sensorManger.cpp
实现对
sensor
的数据控制。
sensor.so
通过
ioctl
控制
sensor driver
的状态,通过打开
sensor driver
对应的设备文件读取
G-sensor
采集的数据。
android SDK
提供了
4
个类来于
sensor
通信,分别为
sensor,sensorEvent,sensorEventListener,sensorManager.
其中
sensorEventListener
用来在
sensorManager
中注册需要监听的
sensor
类型。
sensorManager.java
提供
registrater(),unregistrater()
接口供
sensorEventListener
使用。
sensorManager.java
不断轮询从
sensor.so
中取数据。取到数据后送给负责监听此类型
sensor
的
sensorEventListener.java
。
sensorEventListener.java
通过在
sensorManager.java
中注册可以监听特定类型的
sensor
传来的数据。
系统启动时执行
systemProcess,
会启动
sensorService.java,
在
sensorService.java
的构造函数中调用
JNI
方法
_sensor_control_init()
。
sensorService.cpp
中相应的方法
android_int()
会被执行。该函数会调用
hardware.c
中的方法
hw_get_module()
此函数又通过调用
load()
函数在
system/lib/hw
下查找
sensor.so
查找时会根据
harware.c
中定义好的
sensor.*.so
的扩展名的顺序查找,找到第一个匹配的时候即停止,并将该
sensor.so
中定义好的一个全局变量
HAL_MODULE_INFO_SYM
带回。该变量包含的一个
重要信息是它的一个成员结构变量中包含的一个函数指针
open
,该指针所指函数会对一个
device
结构变量赋值,从而带出
sensorService.cpp
和
sensorManager.cpp
与
sensor
通信所需要的全部信息。
device
结构变量有两种变体分别供
sensorService.cpp
和
sensorManaer.cpp
使用。其中主要是一些函数指针指向与
sensor
通信的函数。
sensorService.cpp
和
sensorManager.cpp
在得到
HAL_MODULE_INFO_SYM
结构后都会调用
sensors.h
的
inline
函数
open()
通过
HAL_MODULE_INFO_SYM
的
open
函数指针将所需的
device
信息取回。
系统在启动
activityManager.java
时,它会启动
sensorManager.java
,它也会调用
hardware.c
中的方法
hw_get_module()
带回
HAL_MODULE_INFO_SYM