一,Linux內(nèi)核的基礎(chǔ)知識(shí)
二,Binder通信機(jī)制介紹
三,AIDL
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一,linux內(nèi)核的基礎(chǔ)知識(shí)
1,進(jìn)程隔離/虛擬空間地址空間
? ? ? ? ?對(duì)于操作系統(tǒng)而言,不同進(jìn)程間數(shù)據(jù)不共享
? ? ? ? Binder通信機(jī)制? ?=? ?不同進(jìn)程間通信
2,系統(tǒng)調(diào)用
? ? 即對(duì)內(nèi)核有某些保護(hù)機(jī)制來(lái)告訴應(yīng)用程序,哪些可以調(diào)用,哪些不可以調(diào)用。
? ? 即講內(nèi)核層與上層應(yīng)用程序抽象分離開(kāi)來(lái)。
? ? 也就是內(nèi)核層和用戶空間。
? ? 系統(tǒng)調(diào)用,可以在用戶空間內(nèi)訪問(wèn)內(nèi)核的某些程序。
3,Binder驅(qū)動(dòng)
? ? ? 在安卓系統(tǒng)中,運(yùn)行在內(nèi)核空間,負(fù)責(zé)各個(gè)用戶進(jìn)程,通過(guò)Binder通信的內(nèi)核來(lái)進(jìn)行通信,驅(qū)動(dòng)程序一般指設(shè)備的驅(qū)動(dòng)程序,可以使計(jì)算機(jī)和設(shè)備通信的特殊程序,雖是軟件又相當(dāng)于硬件接口,操作系統(tǒng)可通過(guò)接口,控制硬件設(shè)備。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 二,Binder通信機(jī)制的介紹
1,為什么要使用Binder
2,binder的通信模型
3,binder通信機(jī)制原理
1,為什么要使用binder
1)android使用linux內(nèi)核擁有著非常多的跨進(jìn)程通信機(jī)制(管道,socket)
2)性能(廣泛地使用跨進(jìn)程通信,肯定對(duì)通信機(jī)制本身提出嚴(yán)格地要求,Binder相當(dāng)于傳統(tǒng)的Socket方式,更高級(jí))
3)安全(由于傳統(tǒng)的進(jìn)程間的通信對(duì)通信雙方的身份作出嚴(yán)格的驗(yàn)證,只有上層協(xié)議才會(huì)進(jìn)行架構(gòu))
? ? ?比如說(shuō)Socket通信,IP地址是客戶端手動(dòng)填寫(xiě)的,你可以人為地偽造,而binder通信從協(xié)議本身就支持通信雙方進(jìn)行身份校驗(yàn),這是binder在安全性上做出的努力,在這基礎(chǔ)上大大提高了安卓程序的安全性,這binder身份校驗(yàn),也是安卓權(quán)限,模型的基礎(chǔ)
2,binder通信模型
1,電話基站:binder驅(qū)動(dòng);
2,通信錄:SeviceManager;
? ? ? ? ? ? ? ? ?進(jìn)程A? ?----> (通信) --------->進(jìn)程B
借助內(nèi)核:?
? ? ? ? ? ? ? ? Binder驅(qū)動(dòng)---------(功能類(lèi)似于)---------->? ? 電話基站
? ? ? ? ? ? ? ? ServiceManager---------(功能類(lèi)似于)---------->? ? 通信錄

1,首先建一張ServiceManager表
2,把“電話號(hào)碼”存入(注冊(cè))? --->? ServiceManager中
3,當(dāng)有同學(xué)與其它同學(xué)進(jìn)行交互時(shí),會(huì)進(jìn)入ServiceManager中查詢“電話號(hào)碼”,然后ServiceManager會(huì)返回“電話號(hào)碼”。
4,“聯(lián)系”:Binder通信
3,Binder通信介紹

數(shù)據(jù)在內(nèi)核里。
進(jìn)程 > 線程
add方法是空方法
參數(shù)包裝好后返回內(nèi)核去調(diào)用給Binder驅(qū)動(dòng) ------>? 進(jìn)入SM中的表-------> 通知服務(wù)端,再替換,調(diào)用add方法再把參數(shù)弄回去
問(wèn):到底什么是Binder?
答:
1)通常意義下,Binder指的是一種(跨進(jìn)程)通信機(jī)制
2)對(duì)Server進(jìn)程而言,Binder指的是Binder本地對(duì)象 / 對(duì)于Client而言,Binder指的是Binder代理對(duì)象
3)對(duì)于傳輸過(guò)程而言,Binder是可以進(jìn)行跨進(jìn)程傳送的對(duì)象。
三,AIDL
定義:?
? ? ? ?AIDL(Android Interface Definition Language)是Android接口定義語(yǔ)言的意思,它可以用于讓某個(gè)Service與多個(gè)應(yīng)用程序組件之間進(jìn)行跨進(jìn)程通信,從而可以實(shí)現(xiàn)多個(gè)應(yīng)用程序共享同一個(gè)Service的功能。
? ? ? 實(shí)際上實(shí)現(xiàn)跨進(jìn)程之間通信的有很多,比如廣播,Content Provider,但是AIDL的優(yōu)勢(shì)在于速度快(系統(tǒng)底層直接是共享內(nèi)存),性能穩(wěn),效率高,一般進(jìn)程間通信就用它。
即gen目錄下,asInterface()方法中,若同進(jìn)程則不會(huì)走跨進(jìn)程,不同進(jìn)程則走跨進(jìn)程(用IBinder),返回StubProxy(obj)一個(gè)代理對(duì)象。
onTransace()方法通過(guò)AIDL返回的編號(hào),來(lái)進(jìn)行相應(yīng)的方法,傳遞編號(hào)使用compute()方法。
IBinder--接口
? ? ? ? ? ? ? 代理表跨進(jìn)程傳輸?shù)哪芰?,?shí)現(xiàn)該接口就能跨進(jìn)程傳遞
? ? ? ? ? ? ? 在底層傳輸時(shí),驅(qū)動(dòng)會(huì)識(shí)別IBinder類(lèi)型的數(shù)據(jù)
? ? ? ? ? ? ? 如果是IBinder代理,即IBinderProxy對(duì)象
compute方法中,先用pracel序列表代碼,transact方法,最后調(diào)用onTransact方法。
AIDL的操作例子,收藏文章如下: