編輯:關於Android編程
1.每個硬件抽象層模塊在內核中都對應一個驅動程序,硬件抽象層模塊就時通過這些驅動程序來訪問硬件設備的,它們是通過讀寫設備文件來進行通信的。
硬件抽象層中的模塊接口源文件一般保存在hardware/libhardware目錄中,為了方便起見,我們將虛擬硬件設備freg在硬件抽象層中的模塊名稱定義為freg,目錄結構如下:
hardware/libhardware/include/hardware/freg.h
hardware/libhardware/modules/freg/Android.mk
hardware/libhardware/modules/freg/freg.cpp
上述三個文件分別對應模塊的頭文件、makefile文件、源文件。
2.HAL層的編譯步驟
首先要修改hardware/libhardware/modules下面的Android.mk文件,如下:
hardware_modules := gralloc hwcomposer audio nfc nfc-nci local_time
power usbaudio audio_remote_submix camera consumerir sensors vibrator
tv_input fingerprint freg
include $(call all-named-subdir-makefiles,$(hardware_modules))
修改點:將freg加入到hardware_modules變量當中
編譯:mmm ./hardware/libhardware/modules
結果:會生成一個HAL層的動態庫,比如freg.default.so
3.查看freg.default.so
使用linux的nm工具可以查看動態庫的符號表,我們查看out/target/product/XXXX/symbols/system/lib/hw
目錄下面的freg.default.so動態庫文件,命令如下:
nm freg.default.so
輸出:
00000549 t _ZL12freg_get_valP13freg_device_tPi
0000059d t _ZL12freg_set_valP13freg_device_ti
000004b9 t _ZL16freg_device_openPK11hw_module_tPKcPP11hw_device_t
000004ad t _ZL17freg_device_closeP11hw_device_t
00002084 d _ZL19freg_module_methods
我們就可以看到確實是有HAL層的函數被編入。
4.加載硬件抽象層模塊
上面我們生成了硬件抽象層對應的.so文件,那麼怎麼加載.so呢?Android系統中的硬件抽象層是由系統統一加載的,當調用者需要加載這些模塊時,只要指定ID就可以了,在Android硬件抽象層中,負責加載硬件抽象層的函數是hw_get_module函數,原型如下:
int hw_get_module(const char *id, const struct hw_module_t **module);
比如我們傳入參數FREG_HARDWARE_MODULE_ID,即”freg”,函數內部找到相應的.so文件,然後,最後調用load加載。
在前面的Linux文件系統Inotify機制 中介紹了Linux對文件變更監控過程。Android系統在此基礎上封裝了一個FileObserver類來方便使用Inotif
第十八章、代理模式 代理模式也稱委托模式,是結構型設計模式之一。是應用廣泛的模式之一。1.定義為其他對象提供一種代理以控制對這個對象的訪問。2.使用場景當無法或不想直接訪
研究增量更新的熱情被激發了,通過幾天的資料查找和學習,搞懂增量更新之余,也順便練習了下NDK開發。效果圖預覽開發環境Android Studio 2.2.1 For W
原理Android客戶端模擬一個HTTP的Post請求到服務器端,服務器端接收相應的Post請求後,返回響應信息給給客戶端。背景 網上很多上傳到java服務器上的,找了好