前言
Android系統(tǒng)是基于Linux系統(tǒng)的,理論上應(yīng)該使用Linux內(nèi)置的IPC方式。Linux中的IPC方式有管道、信號(hào)量、共享內(nèi)存、消息隊(duì)列、Socket,Android使用的Binder機(jī)制不屬于Linux。Android不繼承Linux中原有的IPC方式,而選擇使用Binder,說(shuō)明Binder具有一定的優(yōu)勢(shì)。
什么是Binder
- Android系統(tǒng)進(jìn)程間通信(IPC---Inter-Process Communication-進(jìn)程間通信)方式之一
- Linux的驅(qū)動(dòng)/dev/binder (是一個(gè)binder文件)
- 是安卓系統(tǒng)系統(tǒng)中的Binder類(lèi),實(shí)現(xiàn)了IBinder接口
- 從Android Framework角度來(lái)說(shuō),Binder是ServiceManager連接各種Manager和相應(yīng)ManagerService的橋梁;
Binder機(jī)制具體有兩層含義:
- Binder是一種跨進(jìn)程通信(IPC,Inter-Process Communication)的手段;
- Binder是一種遠(yuǎn)程過(guò)程調(diào)用(RPC,Remote Procedure Call)的手段。
使用Binder的原因
- 性能方面:
1.socket: 作為一款通用接口,其傳輸效率低,開(kāi)銷(xiāo)大,主要用在跨網(wǎng)路的進(jìn)程間通信和本機(jī)上進(jìn)程間的低速通信。
2.消息隊(duì)列和管道:采取存儲(chǔ)-轉(zhuǎn)發(fā)方式,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開(kāi)辟的緩存區(qū)中,然后再?gòu)膬?nèi)核緩存區(qū)拷貝到接收方緩存區(qū),至少有兩次拷貝的過(guò)程。
3.共享內(nèi)存:雖然無(wú)需拷貝,但控制復(fù)雜,難以使用。
4.Binder:只需要一次數(shù)據(jù)拷貝,性能上僅次于共享內(nèi)存。
-穩(wěn)定性方面
- Binder基于C/S架構(gòu),客戶(hù)端(Client)有什么需求就丟給服務(wù)端(Service)去完成,架構(gòu)清晰,職責(zé)明確又相互獨(dú)立,自然穩(wěn)定性好。
- 共享內(nèi)存:雖然無(wú)需拷貝,但是控制復(fù)雜,難以使用。
- 從穩(wěn)定的角度講,Binder機(jī)制是優(yōu)于內(nèi)存共享的。
-安全方面
- 傳統(tǒng)的IPC沒(méi)有任何安全措施,完全依賴(lài)上層協(xié)議來(lái)確保。
- 傳統(tǒng)的IPC接收方無(wú)法獲得對(duì)方可靠的進(jìn)程用戶(hù)ID/進(jìn)程ID(UID/PID),從而無(wú)法鑒別對(duì)方身份。