首页 > 学院 > 常见问题 > 正文

安卓apk到g-sensor driver的大致流程

2019-12-21 04:50:26
字体:
来源:转载
供稿:网友

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。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表