一、HIDL概述
1. Google對於HIDL的詳細說明,以及語法解析鏈接如下:https://source.android.com/devices/architecture/hidl/ (需要FQ才可以打開)
2. HIDL的定義
HIDL 全稱是 Hardware Interface Definition Language。在 Android 8.0 中被全面使用。其誕生目的是:框架可以在無需重新構建 HAL 的情況下進行替換。HAL將由供應商或SOC 制造商構建,放置在設備的 /vendor 分區中,這樣一來,框架就可以在其自己的分區中通過 OTA 進行替換,而無需重新編譯 HAL。
3. HAL的類型
為了更好地實現模塊化,Android 8.0 對 Android 操作系統底層進行了重新架構。運行 Android 8.0 的設備必須支持綁定式或直通式 HAL:
(1)綁定式 HAL: 以 HAL 接口定義語言 (HIDL) 表示的 HAL。在綁定式 HAL 中,Android 框架和 HAL 之間通過 Binder 進程間通信 (IPC) 調用進行通信。所有在推出時即搭載了 Android 8.0 或后續版本的設備都必須只支持綁定式 HAL。(這個是趨勢)
(3)直通式 HAL。以 HIDL 封裝的傳統 HAL 或舊版 HAL。這些 HAL 封裝了現有的 HAL,可在綁定模式和 Same-Process(直通)模式下使用。升級到 Android 8.0 的設備可以使用直通式 HAL。
4. HIDL的實現
1.Android O 對 Android 操作系統的架構重新進行了設計,以在獨立於設備的 Android 平台與特定於設備和供應商的代碼之間定義清晰的接口。Android 已經以 HAL 接口的形式(在 hardware/libhardware 中定義為 C 標頭)定義了許多此類接口。HIDL 將這些 HAL 接口替換為穩定的帶版本接口,它們可以是采用 C++(如下所述)或 Java 的客戶端和服務器端 HIDL 接口。
5. HIDL 接口具有客戶端和服務器實現
HIDL接口的客戶端:指通過在該接口上調用方法來使用該接口的代碼
HIDL接口的服務器端:指 HIDL 接口的實現,它可接收來自客戶端的調用並返回結果。
在 libhardware HAL 轉換為 HIDL HAL 的過程中,HAL 實現成為服務器,而調用 HAL 的進程則成為客戶端。
6. HIDL版本維護
HIDL 要求每個使用 HIDL 編寫的接口均必須帶有版本編號。HAL 接口一經發布便會被凍結,如果要做任何進一步的更改,都只能在接口的新版本中進行。雖然無法對指定的已發布接口進行修改,但可通過其他接口對其進行擴展。
然而雖然google規定,已經發的hal版本是不能再更改的,除非再update成新的版本,而在porting的平台上,幾乎都沒有遵守這個規定,只是在原先的基礎版本上去update而已,把要修改的文件進行重新繼承整理,沒更新版本。但這樣卻也可以過google的測試。。。
7.為什么需要HIDL
HIDL 是用於指定 HAL 與其用戶之間接口的一個接口描述語言(Interface Description Language),它允許定義變量和函數類型做成封裝接口給其他程序調用。通俗的說,HIDL是兩個獨立程序的橋梁,另外兩個程序可以獨自編譯生成互不影響。
HIDL 實際上是用於進行進程間通信(Inter-process Communication,IPC)。進程間的通信可以稱為 Binder 化(Binderized)。對於必須連接到進程的庫,也可以使用 passthough 模式(但在Java中不支持)。
HIDL 將指定的數據結構與方法簽名組織到接口中,這些接口又會被收集到包中以供使用。它的語法與 C++、JAVA 是類似的,不過他們的關鍵字存在一些差異。其注釋風格與 JAVA 是一致的。
設計 HIDL 這個機制的目的,主要是想把**框架(framework)**與 HAL 進行隔離,使得框架部分可以直接被覆蓋、更新,而不需要重新對 HAL 進行編譯。HAL 的部分將會放在設備的 /vendor 分區中,並且是由設備供應商(vendors)或 SOC 制造商來構建。這使得框架部分可以通過 OTA 方式更新,同時不需要重新編譯 HAL。
如果Framework直接調用 HAL,這樣導致一個問題,如果HAL增加了什么接口,就需要重新整個都編譯系統。大佬們就發現了這個問題,然后就想多加一個東西,這個東西可以規范一些接口,底層的同學就去填充這些接口就好了。然后就有了直通模式,Binderized化模式。
8.是Framework和HAL的發展圖示

二、參考
Android O HIDL的實現對接:https://blog.csdn.net/gh201030460222/article/details/80551897
1.偏向於應用和實踐
AndroidO Treble架構下hwservicemanager啟動過程: https://blog.csdn.net/marshal_zsx/article/details/80293163
1.偏向於代碼走讀,更詳細更好,有舉例Composer.hal。
2.對於Composer.hal最后查找的動態庫是android.hardware.graphics.composer@2.1-impl.so,調用函數集是HIDL_FETCH_IComposer
3.各個.hal文件,首先會注冊到HwServiceManager里面,然后由HwServiceManager再統一注冊進ServiceManager中!
