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端進程的腳本
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進程會讀取並解析這個腳本
當然也可以自己手動執行這個bin文件[email protected]
達到同樣效果!這樣服務端就啓動起來了!
如何調用客戶端?
通過getService
getPassthroughServiceManager
獲取binder對象,其他跟aidl一樣!
有一點需要注意,就是我們可以通過app方式(Java)或者bin執行文件(cpp)方式調用客戶端!
三種模式:
使用 passthrough 模式
Passthrough header files
Binderizing passthrough HALs