HIDL理解

hidl與aidl的區別?

HIDL的全稱是HAL interface definition language(硬件抽象層接口定義語言),在此之前Android 有AIDL,架構在Android binder 之上,用來定義Android 基於Binder通信的Client 與Service之間的接口。HIDL也是類似的作用,只不過定義的是Android Framework與Android HAL實現之間的接口
 

hidl跟以前的HAL有什麼區別?

在Android O之前,HAL是一個個的.so庫,通過dlopen來進行打開,庫和framework位於同一個進程

在Android O之後,framework和hal運行於不同的進程,所有的HAL採用新的HIDL技術來完成

先從hardware這個目錄開始研究下:

hidl節點文件    /dev/hwbinder

hardware/interfaces/xxx/1.0/default/

 

實現HAL接口端的共享庫

[email protected]  //binder client端

$(GEN): $(LOCAL_PATH)/Ixxx.hal
    $(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)
include $(BUILD_JAVA_LIBRARY)

 

實現HAL實現端的共享庫

[email protected]   //binder server端

LOCAL_MODULE := [email protected]

LOCAL_SRC_FILES := \
    xxx_impl.cpp \

include $(BUILD_SHARED_LIBRARY)

 

Android native 進程入口

[email protected]  //Android native 進程入口

啓動binder server端進程的腳本

[email protected]

service xxx-hal-1-0 /vendor/bin/hw/[email protected]
    class hal
    user system
    group system

binder server啓動

LOCAL_MODULE := [email protected]
LOCAL_INIT_RC := [email protected]

LOCAL_SRC_FILES := \
    service.cpp \

include $(BUILD_EXECUTABLE)

service.cpp

int main() {
    return defaultPassthroughServiceImplementation<IDlpc3435>();
}

研究三種模式中的簡單的直通(passthrough)模式

registerPassthroughServiceImplementation 函數是 HAL 服務的註冊過程

將 Ixxx 服務註冊到 hwservicemanager 中

service->registerAsService(name);//將Ixxx註冊到hwservicemanager中

getPassthroughServiceManager()

創建一個new PassthroughServiceManager()  通過PassthroughServiceManager查詢服務

拼接出後面需要查找的函數名HIDL_FETCH_Ixxx和庫名字[email protected],然後查找"/system/lib64/hw/"、"/vendor/lib64/hw/"、"/odm/lib64/hw/"下是否有對應的so庫。接着通過dlopen載入/vendor/lib/hw/[email protected],然後通過dlsym查找並調用HIDL_FETCH_Ixxx函數

HIDL_FETCH_Ixxx{

      hw_get_module(xxx_HARDWARE_MODULE_ID, &hw_module);

      hw_module->methods->open(hw_module

}

通過hw_get_module就和Android O以前的Hal模式一致
 

接下來的流程就跟之前HAL一樣。。。

 

 

什麼時候執行腳本?

開機時,init進程會讀取並解析這個腳本

[email protected]

當然也可以自己手動執行這個bin文件[email protected]

達到同樣效果!這樣服務端就啓動起來了!

 

如何調用客戶端?

加載[email protected] 

通過getService

getPassthroughServiceManager

獲取binder對象,其他跟aidl一樣!

有一點需要注意,就是我們可以通過app方式(Java)或者bin執行文件(cpp)方式調用客戶端!

 

三種模式:

使用 passthrough 模式

Passthrough header files

Binderizing passthrough HALs

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