Android——Binder

該文章的知識點基本上來自於這個鏈接,而後融入了本身的一些理解:http://gityuan.com/2015/10/31/binder-prepare/java

1. 背景知識linux

Android的四層結構中,最底層是linux的kenel層,也就是說Android實際上仍是基於linux來進行實現的,基本的實現代碼是C語言,而C語言是一個面向結構的語言,而非是面向對象的語言android

那麼,linux中有不少的IPC通訊機制,來進行進程間的通訊,爲什麼android還要建立本身的進程間通訊機制Binder哪? 接下來,先看下linux下不一樣的通訊機制git

linux下的進程通訊手段基本上都是從Unix平臺上繼承而來的,最初的Unix IPC有緩存

管道及有名管道:管道在建立的時候會分配一個page大小的內存,其緩存區大小比較有限,並且管道在數據拷貝時須要進行兩次拷貝安全

消息隊列:一個FIFO的消息隊列,一樣須要進行兩次數據拷貝,並且因爲須要維護這個消息隊列,所以是須要額外的CPU消耗的,並不適合與信息量很大的通訊網絡

信號:信號本質上是通知某個進程某個事情發生了,從而某個進程知道本身下一步須要幹些什麼,進程也能夠本身給本身發信號進行控制。因此信號更加適合與進程的中斷控制等等,而不是用來進行信息的交換架構

信號量:更多地是做爲一種鎖的機制,保證了進程之間以及線程之間的數據同步問題。app

套接口:更爲通常的進程間通訊機制,主要是用於不一樣的操做系統,不一樣的設備,不一樣的網絡之間的進程間通訊。最初由Unix系統的BSD分支開發,後來被普遍應用與其餘系統之上。可是因爲其更加通用,所以傳輸效率是比較低的,並且一樣須要拷貝兩次數據socket

共享內存:多個進程能夠訪問同一個內存空間,是全部IPC中效率最高的進程間通訊,並且根本不須要任何的數據拷貝,是直接共享的。

 

2. Binder的出現

綜上,信號和信號量基本上被排除了,不適合與用來進行Android四大組件之間的信息傳遞,接下來就剩其餘三個了

(1) 語言上,linux的IPC都是使用C語言來實現的,而整個Android的framework層以及application層都是使用java來實現的。

(2) 從協議上來說,Android的創造者並不像開源他的代碼,這也是自身的商業性質決定的。而linux的主線是開源的。

上面這兩個多是Binder出現的最本質緣由,而下面是從開發者角度來看

(3) 性能上,binder只須要一次數據拷貝,而管道 ,套接口,消息隊列都須要兩次數據拷貝。

(4) 共享內存雖然不須要進行數據拷貝。但從穩定性上來說,採用C/S的bander比共享內存更加穩定。

(5) 安全上,linux的IPC沒法獲取對方進程可靠的UID/PID,而Android給應用分配了本身的UID,並且C/S模式保證了Android系統對外只暴露client,而保護了server端。

 

3. BBinder,BpBinder,IBinder

BBinder:對於serveice來講,都是繼承了BBinder(BnInterface)。BBinder.onTransact()接收相應的事務請求

BpBinder:對與client來講,都是繼承了BpBinder(BpInterface)。BpBinder.transact()分發事務請求

IBinder:至關於一個指針,就像socket的ID同樣,IBinder是一個進程的惟一標識,是重構上述兩個Binder時做爲參數傳入的。BBinder和BpBinder都是繼承於IBinder的

 

4. Binder的架構

圖片一樣來自於:http://gityuan.com/2015/10/31/binder-prepare/

(1) Service Manager至關於一個管理者,指的是Native曾的ServiceManager(C++),是Binder的守護進程

(2) Client和Server的通訊須要先獲取Service Manager接口,而後才能開始進行通訊

 

 

源碼分析以後會慢慢補上。。。

相關文章
相關標籤/搜索