android上层应用apk到G-sensor driver的大致流程

有德业
2023-12-01

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

 类似资料: