Android通信方式篇(四)-Binder機制(開篇)

無Binder不Android,Android開發(fā)尤其是做framework的應(yīng)該都有深刻體會,這個專題遲早是要做的,那么話不多說開始吧。

一、什么是Binder

簡單地說,Binder是Android平臺上的一種跨進(jìn)程交互技術(shù)。該技術(shù)最早并不是由Google公司提出的,它的前身是Be Inc公司開發(fā)的OpenBinder,而且在Palm中也有應(yīng)用。后來OpenBinder的作者Dianne Hackborn加入了Google公司,并負(fù)責(zé)Android平臺的開發(fā)工作,所以把這項技術(shù)也帶進(jìn)了Android。

我們知道,在Android的應(yīng)用層次上,基本上已經(jīng)沒有過去的進(jìn)程概念了。然而在實現(xiàn)層次,它畢竟還是要建構(gòu)在進(jìn)程之上的。實際上,在 Android內(nèi)部,那些支撐應(yīng)用的組件往往會身處于不同的進(jìn)程,那么應(yīng)用的底層必然會牽涉大量的跨進(jìn)程通信。因此Android提供了Binder作為IPC方案。

二、Android為什么要使用Binder作為IPC方案

我們都知道,Linux進(jìn)程通信方案有很多,那么Android為什么要使用Binder作為IPC方案?

先簡單概括性地說說Linux現(xiàn)有的所有進(jìn)程間IPC方式:

方式 說明
管道 在創(chuàng)建時分配一個page大小的內(nèi)存,緩存區(qū)大小比較有限;
消息隊列 信息復(fù)制兩次,額外的CPU消耗;不合適頻繁或信息量大的通信;
共享內(nèi)存 無須復(fù)制,共享緩沖區(qū)直接付附加到進(jìn)程虛擬地址空間,速度快;但進(jìn)程間的同步問題操作系統(tǒng)無法實現(xiàn),必須各進(jìn)程利用同步工具解決;
套接字 作為更通用的接口,傳輸效率低,主要用于不通機器或跨網(wǎng)絡(luò)的通信;
信號量 常作為一種鎖機制,防止某進(jìn)程正在訪問共享資源時,其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。
信號 不適用于信息交換,更適用于進(jìn)程中斷控制,比如非法內(nèi)存訪問,殺死某個進(jìn)程等;

然后我們從以下幾方面來做個對比:

  • 性能角度(數(shù)據(jù)拷貝次數(shù)):共享內(nèi)存(0)< Binder(1)< 管道/消息隊列/Socket(2)

  • 穩(wěn)定性角度:Binder是基于C/S架構(gòu)的,結(jié)構(gòu)清晰,兩端相對獨立。而共享內(nèi)存實現(xiàn)方式復(fù)雜,沒有客戶與服務(wù)端之別, 需要充分考慮到訪問臨界資源的并發(fā)同步問題,否則可能會出現(xiàn)死鎖等問題;從這穩(wěn)定性角度看,Binder架構(gòu)優(yōu)越于共享內(nèi)存。

  • 安全性角度:傳統(tǒng)Linux IPC無任何保護(hù)措施,完全由上層協(xié)議來確保,另外無法鑒別對方進(jìn)程身份。 Binder機制對于通信雙方的身份是內(nèi)核進(jìn)行校檢支持的,可以獲得對方進(jìn)程可靠的UID/PID,做安全訪問控制。

所以總結(jié)Binder的特點:
基于C/S架構(gòu),兩端相對獨立,穩(wěn)定性好;為發(fā)送方添加UID/PID進(jìn)行身份核驗,安全性好;僅需1次數(shù)據(jù)拷貝,效率較高。

三、Binder數(shù)據(jù)共享原理

每個Android的進(jìn)程,只能運行在自己進(jìn)程所擁有的虛擬地址空間。對應(yīng)32位系統(tǒng)4GB的虛擬地址空間,其中3GB是用戶空間,1GB是內(nèi)核空間,當(dāng)然內(nèi)核空間的大小是可以通過參數(shù)配置調(diào)整的。對于用戶空間,不同進(jìn)程之間彼此是不能共享的,而內(nèi)核空間卻是可共享的。Client進(jìn)程向Server進(jìn)程通信,恰恰是利用進(jìn)程間可共享的內(nèi)核內(nèi)存空間來完成底層通信工作的,Client端與Server端進(jìn)程往往采用ioctl等方法跟內(nèi)核空間的驅(qū)動進(jìn)行交互。

from gityuan

內(nèi)核態(tài)/用戶態(tài):
當(dāng)一個任務(wù)(進(jìn)程)執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時,我們就稱進(jìn)程處于內(nèi)核運行態(tài)(或簡稱為內(nèi)核態(tài))此時處理器處于特權(quán)級最高的(0級)內(nèi)核代碼中執(zhí)行。當(dāng)進(jìn)程在執(zhí)行用戶自己的代碼時,則稱其處于用戶運行態(tài)(用戶態(tài))。即此時處理器在特權(quán)級最低的(3級)用戶代碼中運行。處理器在特權(quán)等級高的時候才能執(zhí)行那些特權(quán)CPU指令。

四、Binder架構(gòu)

4.1 分層設(shè)計:

from gityuan

  • Java應(yīng)用層: 對于上層應(yīng)用通過調(diào)用AMP.startService, 完全可以不用關(guān)心底層,經(jīng)過層層調(diào)用,最終必然會調(diào)用到AMS.startService.

  • Framework層: Binder通信是采用C/S架構(gòu), Android系統(tǒng)的基礎(chǔ)架構(gòu)便已設(shè)計好Binder在Java framework層的Binder客戶類BinderProxy和服務(wù)類Binder;

  • Native 層: 對于Native層,如果需要直接使用Binder(比如media相關(guān)), 則可以直接使用BpBinder和BBinder(當(dāng)然這里還有JavaBBinder)即可, 對于上一層Java IPC的通信也是基于這個層面.

  • Kernel層: 這里是Binder Driver, 前面3層都跑在用戶空間,對于用戶空間的內(nèi)存資源是不共享的,每個Android的進(jìn)程只能運行在自己進(jìn)程所擁有的虛擬地址空間, 而內(nèi)核空間卻是可共享的. 真正通信的核心環(huán)節(jié)還是在Binder Driver.

4.2 C/S架構(gòu)設(shè)計:

from gityuan

Binder通信采用C/S架構(gòu),從組件視角來說,包含Client、Server、ServiceManager以及binder驅(qū)動,其中ServiceManager用于管理系統(tǒng)中的各種服務(wù)。無論是注冊服務(wù)和獲取服務(wù)的過程都需要ServiceManager,它也是整個Binder通信機制的大管家。

另外,圖中的Client,Server,Service Manager之間交互都是虛線表示,是由于它們彼此之間不是直接交互的,而是都通過與Binder驅(qū)動進(jìn)行交互的,從而實現(xiàn)IPC通信方式。其中Binder驅(qū)動位于內(nèi)核空間,Client,Server,Service Manager位于用戶空間。Binder驅(qū)動和Service Manager可以看做是Android平臺的基礎(chǔ)架構(gòu),而Client和Server是Android的應(yīng)用層,開發(fā)人員只需自定義實現(xiàn)client、Server端,借助Android的基本平臺架構(gòu)便可以直接進(jìn)行IPC通信。

那么接下來會分多篇文章,來對Binder進(jìn)行一個相對全面的學(xué)習(xí)。當(dāng)然也會參考許多大神的文章。

參考:

https://www.zhihu.com/question/39440766/answer/81511893
http://gityuan.com/2015/10/31/binder-prepare/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

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

  • 2018.3.8 今天有早讀,所以6:20就出了門。 早讀刷臉后回辦公室喝了幾口熱水,6:...
    豆爸日記閱讀 120評論 0 0
  • 今年的開篇就是斷舍離 在看了兩本有關(guān)家的樣子和兩本斷舍離篇后 我決定每天都從一個角落開始斷舍離 不僅是工作內(nèi)容 工...
    芳草梔子閱讀 215評論 0 0
  • mac系統(tǒng)默認(rèn)安裝的是Python2.7的版本,需要自己手動安裝Python3. (1)安裝xcode。 (2)安...
    瘋狂小魚人閱讀 1,234評論 0 0
  • 昨天紛飛的雪, 在你留海前挽一朵花, 鉑金的耳環(huán)垂下。 環(huán)堤的垂柳任爾長發(fā)及腰, 封凍的河堤有沒有融化, 聆聽窗外...
    江城妖怪閱讀 215評論 0 1
  • 當(dāng)我終于脫離地球的重力,懸在銀河的一端,回想起你在我手中寫過的眾多橫撇豎捺,如同直面一場太陽風(fēng)暴。但每次我在時間的...
    滕y閱讀 58評論 0 0

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