[024]binder,hwbinder,vndbinder之間的關(guān)系

1 前言

先復(fù)制一段來自于android官方文檔的文字
https://source.android.google.cn/devices/architecture/hidl/binder-ipc

一直以來,供應(yīng)商進程都使用 Binder 進程間通信 (IPC) 技術(shù)進行通信。在 Android 8 中,/dev/binder 設(shè)備節(jié)點成為框架進程的專有節(jié)點,這意味著供應(yīng)商進程無法再訪問此節(jié)點。供應(yīng)商進程可以訪問 /dev/hwbinder,但必須將其 AIDL 接口轉(zhuǎn)為使用 HIDL。對于想要繼續(xù)在供應(yīng)商進程之間使用 AIDL 接口的供應(yīng)商,Android 會按以下方式支持 Binder IPC。

Android 8 支持供供應(yīng)商服務(wù)使用的新 Binder 域,訪問此域需要使用 /dev/vndbinder(而非 /dev/binder)。添加 /dev/vndbinder 后,Android 現(xiàn)在擁有以下 3 個 IPC 域:

2 舉個例子

看了上面一段文字之后,可能很多人還是比較懵逼,我來舉一個例子:

假如手機中有如下3類進程

a.應(yīng)用進程:

Camera APP
手電筒 APP

b.框架進程:

System Server進程

c.供應(yīng)商進程:

Camera HAL進程
Light HAL進程

這些進程之間需要使用Binder機制跨進程通信,Android提供了三個Binder設(shè)備節(jié)點dev/binder,dev/hwbinder,dev/vndbinder,也就是Android系統(tǒng)同時提供了三個獨立運行的Binder通信模塊,Android團隊規(guī)定每類進程使用的這三個Binder通信模塊的規(guī)則如下圖:


3 三種Binder介紹以及之間的聯(lián)系

3.1 dev/binder

這個是我們最熟悉的Binder,App開發(fā)中,ActivityManagerService用的都是這個,Java繼承Binder,C++中繼承Bbbinder,然后通過servicemanager進程注冊實名Binder,然后通過已經(jīng)創(chuàng)建好的Binder接口傳遞匿名Binder對象,拿到BinderProxy或者BpBinder以后,就可以Binder通信了。

3.2 dev/vndbinder

其實dev/vndbinde和dev/binder使用方式基本一樣而且是共用一套Binder SDK,也是Java繼承Binder,C++中繼承Bbbinder,但是通過vndservicemanager進程注冊實名Binder,然后通過已經(jīng)創(chuàng)建好的Binder接口傳遞匿名Binder對象,拿到BinderProxy或者BpBinder以后,就可以Binder通信了。如何在使用同一套Binder SDK的代碼,最后訪問的設(shè)備節(jié)點變成dev/vndbinder,servicemanager變成vndservicemanager。

其實和簡單,只要在你這個進程初始化的時候執(zhí)行下面這個代碼

ProcessState::initWithDriver("/dev/vndbinder");
dev/binder和dev/vndbinder無法在一個進程中同時使用

細心的讀者肯定發(fā)現(xiàn)上面的圖中三類進程的任意一個進程無法同時使用dev/binder和dev/vndbinder,這一點不單是android官方約定,也是目前android binder sdk的限制,因為兩者都是共用Binder SDK,所以只能指定一個設(shè)備節(jié)點,要么dev/binder,要么dev/vndbinder

3.3 dev/hwbinder

那么dev/hwbinder是如何解決與dev/binder或dev/vndbinder之間的共存問題?有人肯定想到了,很簡單,我們把所有Binder SDK復(fù)制一套新的Hw Binder SDK,改名成dev/hwbinder,HwBinder,HwBbinder,hwservicemanager,HwProcessState,這樣子不就可以和dev/binder或dev/vndbinder共存了嘛?其實android團隊就會類似這樣子干的。

但是他們想hwbinder是為了規(guī)范hal層,畢竟hal層是操作硬件的,所以他們不應(yīng)該提供這么自由,這么麻煩的接口定義。
他們的目標有兩個:
1.不能那么自由,強制所有供應(yīng)商按照android官方定義的hal接口來實現(xiàn)
2.不能增加供應(yīng)商開發(fā)人員的學習成本,學習一套復(fù)雜的Hw Binder SDK
為了達成上述的兩個目標,android團隊想出了HIDL這個方案。

4 HIDL是什么

具體HIDL做了什么,我不細講了,簡單描述一下:
假如Android官方定義了一個ILight.hal的HAL層接口

Interface ILight {
    void turnOn();
    void turnOff();
}

通過編譯會自動生成如下兩個類LightServer和LightClient的java對象和c++對象。

供應(yīng)商只需要簡單的繼承LightServer,并實現(xiàn)turnOn和turnOff的抽象方法,就可以完成Light接口的實現(xiàn),以及Light服務(wù)注冊到hwservicemanager的代碼。

需要使用ILight接口的進程,只需要調(diào)用sp<ILight> lightClient= ILight::tryGetService(這個方法是自動生成的,不是我們聲明的)就可以完成從hwservicemanager獲得Light服務(wù)的Proxy對象,調(diào)用lightClient的turnOn和turnOff接口就可以完成ILight的Binder接口調(diào)用。

HIDL與AIDL的區(qū)別

看了上面的文字描述,應(yīng)該明白了HIDL比AIDL做的事情更多:
AIDL在Server端串聯(lián)Interface和Binder或者Bbbinder,在Client端串聯(lián)Interface和BinderProxy或者Bpbinder
HIDL則是串聯(lián)Interface->Hw Binder SDK->dev/hwbinder

5 總結(jié)

為什么Android團隊要大費周章搞出那么多Binder,我覺得有以下幾個原因:

1.可以發(fā)現(xiàn)App不可能直接跨過FWK調(diào)用HAL層接口,F(xiàn)WK和HAL之間的接口也是安卓官方限定的,這樣子App的代碼和FWK的代碼可以快速的移植到一個新的平臺,這就是安卓的Project Treble計劃,把硬件HAL和安卓FWK,APP層剝離開,配合上mainline計劃,以后Android系統(tǒng)工程師能改的東西越來越少。

2.估計這個是Android團隊絞盡腦汁想出來的KPI,我猜的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容