谷歌為什么要用AIDL替代HIDL(HAL)?
背景:
官方:
Google 在Android 11引入了AIDL for HALs,旨在代替HIDL原先的作用。在之后的Android版本推薦使用AIDL 實現Hal層的訪問。
這(zhe)樣做(zuo)的原因,應(ying)該(gai)有以下(xia)幾點(dian):
- AIDL比HIDL存在的時間更長(僅從Android 8到Android 10),并在許多其他地方使用,如Android框架組件之間或應用程序中。既然AIDL具有穩定性支持,就可以用單一的IPC方式從HAL到框架進程或者應用進程。
- AIDL還有一個比HIDL更好的版本控制系統。
再詳細的展開說(shuo)就是:
- AIDL 更成熟,使用更廣泛,如果HAL層也使用了AIDL的方式,那么就可以直接從應用進程調用到HAL 進程,以前使用HIDL的時候實現應用進程訪問HAL的服務,需要在system server進程的中介。來個圖:
![]()
- 以前使用HIDL的方式,如果后續vendor HAL version需要迭代升級,那么就需要再創建一個子目錄,過程中實際上做很多的重復工作,冗余而效率不高。
值得注意的是:在HAL 層使用AIDL必須使用Stable AIDL, 和(he)(he)我們在應(ying)用層或者框(kuang)架(jia)層稍微不同,因為(wei)和(he)(he)vendor的(de)要兼顧(gu)穩定性,system和(he)(he)vendor的(de)更新速率(lv)不一樣。
HALs using AIDL to communicate between framework components must use Stable AIDL.
AIDL for HALs實戰
//blog.csdn.net/qq_40731414/article/details/126823262
適用于 HAL 的 AIDL
Android 11 中(zhong)引入了在(zai) Android 中(zhong)使(shi)用(yong) AIDL 實(shi)現 HAL 的(de)(de)功能(neng)。這樣就能(neng)在(zai)不使(shi)用(yong) HIDL 的(de)(de)情況下(xia)實(shi)現 Android 的(de)(de)部分代碼。在(zai)可能(neng)的(de)(de)情況下(xia),應(ying)將(jiang) HAL 轉換為僅使(shi)用(yong) AIDL(當上行(xing) HAL 使(shi)用(yong) HIDL 時,必須使(shi)用(yong) HIDL)。
如果 HAL 使用 AIDL 在框架組件(例如 system.img 中的組件)和硬件組件(例如 vendor.img 中的(de)組件)之間進行通信,必須使(shi)用穩定(ding)的(de) AIDL。不(bu)過,如(ru)需在分區內進行通信(例如(ru)從(cong)一(yi)個 HAL 到另一(yi)個 HAL),則對(dui)需要使(shi)用的(de) IPC 機制沒(mei)有任(ren)何限制。
設計初衷
AIDL 出現(xian)在 HIDL 之前(qian),而且(qie)在 Android 框架組件(jian)之間或應用內等(deng)其他很(hen)多地方都有(you)使用。現(xian)在,由于 AIDL 具備(bei)了(le)穩(wen)定性支持,所以(yi)能夠僅使用一(yi)個 IPC 運行時(shi)環境來實(shi)現(xian)整個堆(dui)棧。此外,AIDL 的(de)版本(ben)控制系統也優于 HIDL。
- 因為僅使用一種 IPC 語言,所以意味著只需了解、調試、優化和保護一個運行時環境。
- AIDL 可為接口所有者提供內建的版本控制機制。
- 所有者可以將方法添加到 Parcelable 的接口或字段的末尾。這意味著可以在持續多年的開發過程中簡化對代碼的版本控制,并逐年降低產生的開銷(可以就地修改類型,而且更新接口版本不需要新增額外的庫)。
- 擴展接口可以在運行時附加,而不是在類型系統中附加,因此無需將下游擴展 rebase 到新版接口上。
- 如果現有 AIDL 接口的所有者選擇使其穩定化,此類接口可以直接沿用。而在以前,這種情況下必須用 HIDL 創建接口的完整副本。
AIDL 與 HIDL 之間的主要差異
使用(yong) AIDL HAL 或使用(yong) AIDL HAL 接口時,請注意(yi)與編寫 HIDL HAL 的差異。
- AIDL 語言的語法更接近 Java。HIDL 語言的語法類似于 C++。
- 所有 AIDL 接口都具有內置的錯誤狀態。請勿創建自定義狀態類型,而應在接口文件中創建常量狀態 int,并在 CPP/NDK 后端使用
EX_SERVICE_SPECIFIC,在 Java 后端使用ServiceSpecificException。詳見。 - 發送 binder 對象時,AIDL 不會自動啟動線程池。您需要手動啟動線程池(詳見)。
- 未經檢查的傳輸錯誤不會導致 AIDL 終止運行(但是未經檢查的錯誤會導致 HIDL
Return終止運行)。 - AIDL 只能為每個文件聲明一種類型。
- AIDL 參數除了可以被指定為 output 參數,還可以被指定為 in/out/inout 參數(沒有“同步回調”)。
- AIDL 將 fd 用作基元類型,而不是句柄。
- HIDL 對不兼容的更改使用主要版本,對兼容的更改使用次要版本。而在 AIDL 中,更改實現了向后兼容。AIDL 沒有明確的主要版本概念,而是將版本更改體現在軟件包名稱中。例如,AIDL 可能會使用軟件包名稱
bluetooth2。 - 默認情況下,AIDL 不會繼承實時優先級。必須根據 binder 使用
setInheritRt函數才能啟用實時優先級繼承。
refs:
//blog.csdn.net/qq_40731414/article/details/126823262
//source.android.com/docs/core/architecture/aidl/aidl-hals?hl=zh-cn
//source.android.com/docs/core/architecture/hidl?hl=zh-cn
//source.android.com/docs/core/architecture/aidl/stable-aidl?hl=zh-cn
//source.android.com/docs/core/architecture/aidl/aidl-backends?hl=zh-cn

