1,什么是Binder?
- 從機(jī)制、模型角度來(lái)說(shuō),Binder是Android為了滿足系統(tǒng)對(duì)通信方式,傳輸性能和安全性的要求而建立的一套新的IPC機(jī)制。Binder基于Client-Server通信模式,傳輸過(guò)程只需一次拷貝(這是通過(guò)內(nèi)存映射實(shí)現(xiàn)的),為發(fā)送方添加UID/PID身份,既支持實(shí)名Binder也支持匿名Binder,安全性高。
- 從模型的結(jié)構(gòu)、組成來(lái)說(shuō),Binder是一種虛擬的物理設(shè)備驅(qū)動(dòng),連接著Service進(jìn)程、Client進(jìn)程和ServiceManager進(jìn)程。
- 從Android代碼角度來(lái)說(shuō),Binder是一個(gè)實(shí)現(xiàn)了IBinder接口的類,將Binder機(jī)制模型以代碼的形式實(shí)現(xiàn)在Android中。
2,相關(guān)的知識(shí)
- 進(jìn)程隔離:為了保護(hù)操作系統(tǒng)中進(jìn)程互不干擾而設(shè)計(jì)的一組不同硬件和軟件的技術(shù)。這個(gè)技術(shù)是為了避免進(jìn)程A寫入進(jìn)程B的情況的發(fā)生。進(jìn)程的隔離實(shí)現(xiàn),使用了虛擬地址空間。進(jìn)程A的虛擬地址和進(jìn)程B的虛擬地址不同,這樣就防止進(jìn)程A將數(shù)據(jù)信息寫入進(jìn)程B。
- 用戶空間/內(nèi)核空間:每個(gè)Android進(jìn)程,只能運(yùn)行在自己進(jìn)程所擁有的虛擬地址空間。這塊虛擬地址空間包括用戶空間和內(nèi)核空間兩部分。對(duì)于用戶空間,不同的進(jìn)程之間彼此不可以共享,而對(duì)內(nèi)核空間,卻是可以共享的。所有的進(jìn)程共用一個(gè)內(nèi)核空間。Client進(jìn)程向Server進(jìn)程通信,恰恰是利用進(jìn)程間可共享的內(nèi)核內(nèi)存空間來(lái)完成底層通信工作的,Client端與Server端進(jìn)程往往采用ioctl等方法跟內(nèi)核空間的驅(qū)動(dòng)進(jìn)行交互。
- 系統(tǒng)調(diào)用/內(nèi)核態(tài)/用戶態(tài):系統(tǒng)調(diào)用是用戶空間訪問(wèn)內(nèi)核空間的唯一方式。通過(guò)這個(gè)統(tǒng)一入口接口,所有的資源訪問(wèn)都是在內(nèi)核的控制下執(zhí)行,以免導(dǎo)致對(duì)用戶程序?qū)ο到y(tǒng)資源的越權(quán)訪問(wèn),從而保障了系統(tǒng)的安全和穩(wěn)定。當(dāng)一個(gè)任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時(shí),我們就稱進(jìn)程處于內(nèi)核運(yùn)行態(tài)(或簡(jiǎn)稱為內(nèi)核態(tài))。當(dāng)進(jìn)程在執(zhí)行用戶自己的代碼時(shí),則稱其處于用戶運(yùn)行態(tài)(用戶態(tài))。將用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間是通過(guò)copy_from_user()函數(shù),將內(nèi)核空間的數(shù)據(jù)拷貝到用戶空間是通過(guò)copy_to_user()函數(shù)。
3,Binder的工作過(guò)程
- Binder機(jī)制的工作成員 : 包括Client進(jìn)程,Server進(jìn)程,Binder驅(qū)動(dòng)和ServiceManager。介紹一下每個(gè)工作成員: Binder驅(qū)動(dòng),用戶空間之間的通信需要Android系統(tǒng)通過(guò)添加一個(gè)運(yùn)行在內(nèi)核空間的內(nèi)核模塊來(lái)完成,這個(gè)運(yùn)行在內(nèi)核空間,負(fù)責(zé)各個(gè)用戶進(jìn)程通過(guò)Binder通信的內(nèi)核模塊就叫做Binder驅(qū)動(dòng)。Binder驅(qū)動(dòng)通過(guò)內(nèi)存映射,傳遞進(jìn)程間的數(shù)據(jù);采用Binder的線程池,并由Binder驅(qū)動(dòng)自身進(jìn)行管理來(lái)實(shí)現(xiàn)線程控制。Client進(jìn)程是使用服務(wù)的進(jìn)程,Server進(jìn)程是提供服務(wù)的進(jìn)程,它們是跨進(jìn)程通信的雙方。由于進(jìn)程隔離的存在,它們之間無(wú)法通過(guò)簡(jiǎn)單的方式進(jìn)行通信。ServiceManager的作用是管理系統(tǒng)中的各種服務(wù)的注冊(cè)與查詢(將字符形式的Binder名字轉(zhuǎn)化成Client中對(duì)該Binder的引用)。Client進(jìn)程,Server進(jìn)程和ServiceManager屬于用戶空間,不可以進(jìn)行進(jìn)程間交互,Binder驅(qū)動(dòng)屬于內(nèi)核空間,可用于進(jìn)行跨進(jìn)程交互。Binder驅(qū)動(dòng)和ServiceManager屬于Android基礎(chǔ)架構(gòu),是系統(tǒng)已經(jīng)實(shí)現(xiàn)好的部分,Client進(jìn)程和Server進(jìn)程屬于Android應(yīng)用層,是需要開發(fā)者自己實(shí)現(xiàn)的部分。
-
Binder的工作過(guò)程: 注冊(cè)服務(wù),獲取服務(wù)和使用服務(wù)三個(gè)步驟。
i. 注冊(cè)服務(wù)的過(guò)程:Server進(jìn)程向Binder驅(qū)動(dòng)發(fā)起服務(wù)注冊(cè)請(qǐng)求,Binder驅(qū)動(dòng)將注冊(cè)請(qǐng)求轉(zhuǎn)發(fā)給ServiceManager進(jìn)程,ServiceManager進(jìn)程添加該Server進(jìn)程,這樣就完成了注冊(cè),Binder驅(qū)動(dòng)持有 Server進(jìn)程創(chuàng)建的Binder實(shí)體。
ii. 獲取服務(wù)的過(guò)程 : Client向Binder驅(qū)動(dòng)發(fā)起獲取服務(wù)的請(qǐng)求,并傳遞要獲取的服務(wù)名稱;Binder驅(qū)動(dòng)將該請(qǐng)求轉(zhuǎn)發(fā)給ServiceManager進(jìn)程;ServiceManager查找到Client需要的Server對(duì)應(yīng)的Binder實(shí)體的Binder引用信息并返回給Binder驅(qū)動(dòng);Binder驅(qū)動(dòng)將上述Binder代理對(duì)象返回給Client。
iii. 使用服務(wù)的過(guò)程:Client進(jìn)程將參數(shù)發(fā)送到Server進(jìn)程;Server進(jìn)程根據(jù)Client進(jìn)程要求調(diào)用目標(biāo)方法;Server進(jìn)程將目標(biāo)方法的結(jié)果返回給Client進(jìn)程。
4,Binder的使用場(chǎng)景
使用Binder,來(lái)實(shí)現(xiàn)Activity與Service的雙向通信。