概況
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)行交互的;

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

從不同的組件來看,
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ù)的具體過程

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