binder域
?為了明確劃分框架(獨立于設(shè)備)和供應商(特定于設(shè)備)代碼之間的 Binder 流量训挡,Android O 介紹了一個 Binder 上下文的概念鹰椒。每個 Binder 上下文都擁有自己的設(shè)備節(jié)點以及上下文(服務(wù))管理者庶灿。當您通過某個上下文傳遞 Binder 節(jié)點時,您只能通過它所屬的設(shè)備節(jié)點來訪問對應的上下文管理器,它只能通過另一個進程來訪問斤贰,從而使得各個域完全隔離。
散集列表
?在以往的 Android 版本中次询,Binder 調(diào)用的每一個數(shù)據(jù)都會被復制三次:
一次是在調(diào)用的進程中將數(shù)據(jù)序列化為一個?Parcel荧恍。
一次是在內(nèi)核驅(qū)動中將?Parcel?拷貝給目標進程。
一次是在目標進程中將?Parcel?反序列化屯吊。
Binder IPC
在 Android O 中送巡,/dev/binder?設(shè)備節(jié)點成為了獨立于框架進程的存在,這就意味著供應商進程不能再訪問它盒卸。供應商進程可以訪問?/dev/hwbinder骗爆,但必須將它們的 AIDL 接口轉(zhuǎn)換為 HIDL 接口。對于需要繼續(xù)在供應商進程間使用 AILD 接口的供應商蔽介,Android 支持如下所述的 Binder IPC摘投。
vndbinder
Android O 支持由供應商服務(wù)所使用的一個新的域,使用?/dev/vndbinder?代替對?/dev/binder?的訪問虹蓄。在添加?/dev/vndbinder?之后犀呼,目前 Binder IPC 共有以下三個域:
通常供應商進程不會直接打開 Binder 驅(qū)動,而是連接到?libbinder?用戶空間庫去薇组,這個庫打開了 Binder 驅(qū)動外臂。加入一個方法為?::android::ProcessState()?選擇用于?libbinder?的 Binder 驅(qū)動程序。在供應商進程調(diào)用?ProcessState律胀,?IPCThreadState?或?qū)θ魏?Binder 的一般性調(diào)用之前宋光,這一方法就應該被調(diào)用了。要使用它炭菌,則請在供應商進程(客戶端和服務(wù)端)的主函數(shù)之后進行如下調(diào)用:
ProcessState::initWithDriver("/dev/vndbinder");
vndservicemanager
在以前罪佳,Binder 驅(qū)動會注冊到?servicemanager?中,這樣它可以被其它進程獲取黑低。而在 Android O 中赘艳,servicemanager?目前已經(jīng)完全只由框架與應用程序來使用,而供應商進程已經(jīng)無法訪問它投储。
供應商服務(wù)現(xiàn)在可以使用?vndservicemanager第练,這是用?/dev/vndbinder?代替了?/dev/binder?而構(gòu)成的新的?servicemanager?實例,它與框架層的?servicemanager?是用同一源碼所構(gòu)建的玛荞。供應商進程不需要為了與?vndservicemanager?進行通訊而做出更改娇掏,當供應商進程打開?/dev/vndbinder?后,服務(wù)就會自動查找到?vndservicemanager勋眯。
vndservicemanager?的二進制文件已經(jīng)包含在 Android 默認的設(shè)備?makefile?中婴梧。
SELinux 策略
?需要使用 Binder 的功能以同其它進程通訊的供應商進程需要以下幾個條件:
訪問?/dev/vndbinder下梢。
Binder 的鉤子函數(shù)?{transfer, call}?設(shè)置到?vndservicemanager?中。
binder_call(A, B)?用于想要通過供應商 Binder 接口來調(diào)用到供應商域 B 的供應商域 A塞蹭。
在?vndservicemanager?中獲得?{add, find}?的服務(wù)權(quán)限孽江。