android上層應用apk到G-sensor driver的大致流程

  android上層應用apkG-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
對於SensorAPI定義在 hardware/libhardware/include/hardware/sensor.h要求在sensor.so提供以下8API函數
[
控制方面]
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);

JavaSensor的狀態控制由SensorService來負責,它的java代碼和JNI代碼分別位於:
frameworks/base/services/java/com/android/server/SensorService.java
frameworks/base/services/jni/com_android_server_SensorService.cpp

JavaSensor的數據控制由SensorManager來負責,它的java代碼和JNI代碼分別位於:
frameworks/base/core/java/android/hardware/SensorManager.java
frameworks/base/core/jni/android_hardware_SensorManager.cpp

android framework
中與sensor通信的是sensorService.javasensorManager.java
sensorService.java
的具體通信是通過JNI調用sensorService.cpp中的方法實現的。
sensorManager.java
的具體通信是通過JNI調用sensorManager.cpp中的方法實現的。

sensorService.cpp
sensorManger.cpp通過hardware.csensor.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.javasensorEventListener.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.cppsensor通信所需要的全部信息。
device
結構變量有兩種變體分別供sensorService.cppsensorManaer.cpp使用。其中主要是一些函數指針指向與sensor通信的函數。
sensorService.cpp
sensorManager.cpp在得到HAL_MODULE_INFO_SYM結構後都會調用 sensors.hinline函數open()通過HAL_MODULE_INFO_SYMopen函數指針將所需的device信息取回。

系統在啓動activityManager.java時,它會啓動sensorManager.java,它也會調用hardware.c中的方法hw_get_module()帶回HAL_MODULE_INFO_SYM

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章