Binder

一,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)似于)---------->? ? 通信錄


image

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通信介紹

image

數(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的操作例子,收藏文章如下:

https://www.cnblogs.com/huangjialin/p/7738104.html

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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