Binder機(jī)制

概況

Android 系統(tǒng)架構(gòu)中大量使用了binder機(jī)制作為IPC(進(jìn)程間通訊)方案

當(dāng)然也存在部分其他的IPC方式,如管道、SystemV、Socket等。那么Android為什么不使用這些原有的技術(shù),而是要使開發(fā)一種新的叫Binder的進(jìn)程間通信機(jī)制呢?

為什么使用binder

性能方面

在移動(dòng)設(shè)備上,廣泛的使用IPC對(duì)性能有更高的要求;binder數(shù)據(jù)拷貝需要一次,原有的socket、管道、消息隊(duì)列等方式需要
(用戶空間A--(copy-from-user)--內(nèi)核空間緩存---(映射)--內(nèi)核空間數(shù)據(jù)接收緩存區(qū)--(映射)--用戶空間B)
進(jìn)行兩次;共享內(nèi)存的方式不需要進(jìn)行進(jìn)行內(nèi)存拷貝,但實(shí)現(xiàn)方式比較復(fù)雜;

安全方面

傳統(tǒng)的進(jìn)程間通訊方式并沒有對(duì)通訊雙方的身份做出嚴(yán)格的驗(yàn)證,比如socket通訊,ip是客戶端手動(dòng)填入,容易偽造,而binder機(jī)制從協(xié)議本身就支持對(duì)通訊雙方做身份校驗(yàn),因此安全性更高。

binder

IPC原理

每個(gè)android的進(jìn)程只能運(yùn)行在自己進(jìn)程所在的虛擬空間,分為用戶空間和內(nèi)核空間,用戶空間不可共享,但內(nèi)核空間共享。client和service通信正是使用內(nèi)核空間來完成底層通信工作的;采用ioclt等方法跟內(nèi)核空間的驅(qū)動(dòng)進(jìn)行交互的;


image

binder原理

binder 通信采用C/S架構(gòu),從組件視角來看由Client,Service,SeviceManager,Binder驅(qū)動(dòng)構(gòu)成,其中servicemanager用于管理系統(tǒng)中的各種服務(wù);架構(gòu)圖如下:

image

從不同的組件來看,
Binder的四個(gè)角色:
Client : 使用服務(wù)的進(jìn)程
Server:提供服務(wù)的進(jìn)程
ServiceManager : ServiceManager的作用是將字符形式的Binder名字轉(zhuǎn)化成Client中對(duì)該
Binder的引用,使得Client 能夠通過Binder名字獲得對(duì)Service中Binder實(shí)體的引用。
Binder驅(qū)動(dòng):驅(qū)動(dòng)負(fù)責(zé)進(jìn)程之間Binder通信的建立,Binder在進(jìn)程之間的傳遞,Binder引用計(jì)數(shù)管理,數(shù)據(jù)包在進(jìn)程之間的傳遞和交互等一系列的底層支持;
Binder 運(yùn)行機(jī)制:圖中Client / Server / ServiceManager 之間的的相互通信都是基于Binder機(jī)制。自然同樣適用的是C/S架構(gòu),圖中的三大步驟都有相應(yīng)的Client,Service端

注冊(cè)服務(wù):Server 進(jìn)程先要注冊(cè)Service 到ServiceManager,此時(shí)Server是客戶端,ServiceManager服務(wù)端
獲取服務(wù):Client進(jìn)程需要使用某個(gè)Service前,需要從ServiceManager中獲取相應(yīng)的Service。該過程:Client是客戶端,ServiceManager是服務(wù)端。
使用服務(wù):Client根據(jù)得到的Service信息建立與Service所在的server進(jìn)程通信的通路,就可以直接與Service交互,此過程,Client是客戶端,server是服務(wù)端

其中Client、Server、ServiceManager之間交互都是虛線,是由于他們之間交互不是直接的,而是通過binder驅(qū)動(dòng)進(jìn)行交互的,從而實(shí)現(xiàn)IPC的通信方式。其中binder位于內(nèi)核空間,Client、Server、ServiceManager位于用戶空間;其中Binder和ServiceManager又可以看做是Android 平臺(tái)的基礎(chǔ)架構(gòu),而Client、Server是Android 的應(yīng)用層,開發(fā)人員只需自定義實(shí)現(xiàn)client、Server端,借助Android的基本平臺(tái)架構(gòu)便可以直接進(jìn)行IPC通信。

使用服務(wù)的具體過程

image
  1. client通過獲得一個(gè)server的代理接口,對(duì)server進(jìn)行調(diào)用。
  2. 代理接口中定義的方法與server中定義的方法時(shí)一一對(duì)應(yīng)的。
  3. client調(diào)用某個(gè)代理接口中的方法時(shí),代理接口的方法會(huì)將client傳遞的參數(shù)打包成Parcel對(duì)象。
  4. 代理接口將Parcel發(fā)送給內(nèi)核中的binder driver。
  5. server會(huì)讀取binder driver中的請(qǐng)求數(shù)據(jù),如果是發(fā)送給自己的,解包Parcel對(duì)象,處理并將結(jié)果返回。
  6. 整個(gè)的調(diào)用過程是一個(gè)同步過程,在server處理的時(shí)候,client會(huì)block住。因此client調(diào)用過程不應(yīng)在主線程。

參與文章:http://m.itdecent.cn/p/4920c7781afe?from=jiantop.com

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

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