• <li id="tllf8"><meter id="tllf8"><th id="tllf8"></th></meter></li>
        1. 手機(jī)
          安卓
          06月 05

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

          編輯:匿名 來源:互聯(lián)網(wǎng)
          放大 縮小 打印 郵件 收藏本頁 游吧論壇

          Android上層應(yīng)用apk到G-sensor driver的大致流程:

          Android HAL層,即硬件抽象層,是Google響應(yīng)廠家“希望不公開源碼”的要求推出的新概念

          1,源代碼和目標(biāo)位置

          源代碼: /hardware/libhardware目錄,該目錄的目錄結(jié)構(gòu)如下:

          /hardware/libhardware/hardware.c編譯成libhardware.so,目標(biāo)位置為/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,目標(biāo)位置為/system/lib/hw目錄

          2,Android對(duì)于Sensor的API定義在 hardware/libhardware/include/hardware/sensor.h中,要求在sensor.so提供以下8個(gè)API函數(shù)

          [控制方面]

          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);

          [數(shù)據(jù)方面]

          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的狀態(tài)控制由SensorService來負(fù)責(zé),它的java代碼和JNI代碼分別位于:

          frameworks/base/services/java/com/Android/server/SensorService.java

          frameworks/base/services/jni/com_Android_server_SensorService.cpp

          在Java層Sensor的數(shù)據(jù)控制由SensorManager來負(fù)責(zé),它的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調(diào)用sensorService.cpp中的方法實(shí)現(xiàn)的。

          sensorManager.java的具體通信是通過JNI調(diào)用sensorManager.cpp中的方法實(shí)現(xiàn)的。

          sensorService.cpp和sensorManger.cpp通過hardware.c與sensor.so通信。其中sensorService.cpp實(shí)現(xiàn)對(duì)sensor的狀態(tài)控制,sensorManger.cpp實(shí)現(xiàn)對(duì)sensor的數(shù)據(jù)控制。

          sensor.so通過ioctl控制sensor driver的狀態(tài),通過打開sensor driver對(duì)應(yīng)的設(shè)備文件讀取G-sensor采集的數(shù)據(jù)。

          Android SDK提供了4個(gè)類來于sensor通信,分別為 sensor,sensorEvent,sensorEventListener,sensorManager。其中 sensorEventListener用來在sensorManager中注冊(cè)需要監(jiān)聽的sensor類型。

          sensorManager.java提供registrater(),unregistrater()接口供sensorEventListener使用。

          sensorManager.java不斷輪詢從sensor.so中取數(shù)據(jù)。取到數(shù)據(jù)后送給負(fù)責(zé)監(jiān)聽此類型sensor的 sensorEventListener.java。sensorEventListener.java通過在sensorManager.java中注冊(cè)可以監(jiān)聽特定類型的sensor傳來的數(shù)據(jù)。

          系統(tǒng)啟動(dòng)時(shí)執(zhí)行systemProcess,會(huì)啟動(dòng)sensorService.java,在sensorService.java的構(gòu)造函數(shù)中調(diào)用JNI方法_sensor_control_init()。

          sensorService.cpp中相應(yīng)的方法Android_int()會(huì)被執(zhí)行。該函數(shù)會(huì)調(diào)用hardware.c中的方法hw_get_module()此函數(shù)又通過調(diào)用load()函數(shù)在system/lib/hw下查找sensor.so

          查找時(shí)會(huì)根據(jù)harware.c中定義好的sensor.*.so的擴(kuò)展名的順序查找,找到第一個(gè)匹配的時(shí)候即停止,并將該sensor.so中定義好的一個(gè)全局變量HAL_MODULE_INFO_SYM帶回。該變量包含的一個(gè)

          重要信息是它的一個(gè)成員結(jié)構(gòu)變量中包含的一個(gè)函數(shù)指針open,該指針?biāo)负瘮?shù)會(huì)對(duì)一個(gè)device結(jié)構(gòu)變量賦值,從而帶出sensorService.cpp和sensorManager.cpp與sensor通信所需要的全部信息。

          device結(jié)構(gòu)變量有兩種變體分別供sensorService.cpp和sensorManaer.cpp使用。其中主要是一些函數(shù)指針指向與sensor通信的函數(shù)。

          sensorService.cpp和sensorManager.cpp在得到HAL_MODULE_INFO_SYM結(jié)構(gòu)后都會(huì)調(diào)用 sensors.h的inline函數(shù)open()通過HAL_MODULE_INFO_SYM的open函數(shù)指針將所需的device信息取回。

          系統(tǒng)在啟動(dòng)activityManager.java時(shí),它會(huì)啟動(dòng)sensorManager.java,它也會(huì)調(diào)用hardware.c中的方法hw_get_module()帶回HAL_MODULE_INFO_SYM。

          打印 郵件 收藏本頁 幫肋
          推薦閱讀
          相關(guān)閱讀
          精品久久久久久久久久中文字幕| 欧美日本在线三级视频| 免费在线观看日韩| 激情久久av一区av二区av三区| 免费一看一级毛片人| 欧美色欧美亚洲高清在线视频| 亚洲精品无码久久久| 欧美丰满熟妇XXXX性大屁股| 亚洲欧美一区二区久久| 最近最新中文字幕2018| 亚洲av综合色区无码专区桃色| 日本高清免费不卡在线播放| 久久水蜜桃亚洲AV无码精品 | 极品一线天馒头lj| 亚洲一区二区三区丝袜| 日本免费一区二区三区最新| 久久久久国产综合AV天堂| 少妇被躁爽到高潮无码文| 一区二区三区在线|日本| 国产黄在线观看免费观看不卡| 97免费人妻无码视频| 国产永久免费高清在线观看视频| 露脸国语对白视频| 国产一区二区三区免费视频| 皇上往下边塞玉器见客| 任你躁国产自任一区二区三区| 欧美妇性猛交视频| 亚洲av永久综合在线观看尤物| 日日摸日日碰夜夜爽亚洲| 中文字幕亚洲精品无码| 天堂在线免费观看mv| 99久久精品免费看国产| 国产日韩欧美久久久| 美女视频黄.免费网址| 十八岁的天空完整版在线观看 | 青苹果乐园在线影院免费观看完整版| 国产亚洲精久久久久久无码| 粉嫩小泬无遮挡久久久久久| 亚洲色偷偷综合亚洲av78| 机机对机机120分免费无遮挡| 久久精品加勒比中文字幕|