1. 程式人生 > >Android系統的Binder機制及其native層應用

Android系統的Binder機制及其native層應用

以下是個人對android中Binder機制的理解,主要是通訊過程的概述,涉及知識不是很深,做到有一個巨集觀的認識,如有錯誤,望指點.

Binder是一種程序間通訊機制.

既然是程序間的通訊,那首先就是存在兩個程序.

android中的程序間通訊是使用binder機制,那麼具體應用在哪些地方呢?

首先看應用在android系統中一些

我們在自己的應用程式中  通過getSystemService()方法 獲取某個系統服務(相當於拿到系統服務的一個引用),然後使用這個服務引用呼叫系統服務裡的相關方法. 

這個過程就是兩個程序間通過binder機制通訊的過程.???

首先存在兩個程序 ,一個是我們自己的應用程式所在的程序,一個是系統服務所在的程序,現在我們需要使用這個系統服務裡面的相關功能,那麼就是誇程序拿到這個服務物件的引用,然後再呼叫其中的方法實現相關功能.說好的binder呢?

下面就用一個類圖來說明上面過程中binder.

這些是android系統服務使用binder通訊涉及的相關類(native 層) ,本人看了相關原始碼和一些書籍就用下面類圖來總結一下.


如上圖 

(這裡將我們應用程式所在的程序稱為客戶端,系統服務所在的程序稱為服務端)

上面涉及binder的幾個類

我用三種背景顏色來描繪 :

紅色背景是共通的類

黃色背景是客戶端使用的類(客服端)

藍色背景是服務端使用的類(服務端)

其中XXX代表系統服務的名稱.

好像看到binder類了是不?  

binder通訊 可以看作就是一個binder物件(BBinder)從自己的程序(服務端)傳遞到另外一個程序(客戶端)了  現在另外一個程序(客戶端)有了這個binder物件(BpBinder)了,那麼利用這個binder物件(BpBinder)就可以和服務端的binder物件(BBinder)通訊了.總之就是BBinder和BpBinder之間的通訊,當然這裡只是我從表面可以這麼看,binder通訊複雜,涉及到binder驅動,個人水平有限沒有研究更深入了.

是不是很奇怪,從一個程序到另外一個程序BBinder就變成BpBinder了?好吧  暫時只要知道結果吧  因為我也沒有涉入更深了

還有BBinder是在怎麼傳遞過去的呢?或者說客戶端是怎麼獲取BpBinder的呢?這個後面再簡單說一下

既然binder物件可以誇程序傳遞,那麼只要寫一個類繼承Ibinder 成為Binder一員,然後可以跨程序傳遞給別的程序了,這樣就實現通訊了.事實的確是這樣,

但是實現通訊只是第一步,實際的交流才是重點,這麼說吧,你現在是binder了,可以傳遞到別人那裡去了(另外一個程序),但是別人拿到的你引用後,是想用你提供的相關服務.所以你是binder 而且你還是一個服務,你即可以提供相關的服務也能實現通訊.

如上面類圖中XXXService  它既可以提供相關服務(是IXXXManager)又能跨程序通訊(是IBinder)   是服務端!!

而在客戶端,我們只拿到BpBinder了,相當於通訊線路接通了,但是你想要什麼功能,卻是是在服務端那邊定義的,所以,客戶端這邊還需要根據服務端能提供什麼服務,對BpBinder進行一定的封裝.

首先客戶端想使用的服務功能必須要和服務端提供的服務功能匹配,所以客戶端這邊也是IXXXManager,同時也含有BpBinder這個通訊線路.

如上面類圖客戶端這邊是BpXXXManager這個物件,你看是不是它既是IXXXManager,也包含了BpBinder(BpRefBase中有BpBinder).

上面的概述只是有一個巨集觀的概述.

上面其中的一個疑問:BBinder是在怎麼傳遞過去的呢?或者說客戶端是怎麼獲取BpBinder的呢?

android中有一個特殊的系統服務.ServiceManager

   用來管理系統中各種服務(ActivityManagerService,PackageManagerService...).簡單來說,就是我應用程式想要獲取某個系統服務,首先是拿到ServiceManager的BpBinder物件,這樣可以和ServiceManager(BBinder)通訊了,從而ServiceManager那裡獲取某個系統服務的BpBinder物件,這樣就可以使用這個系統服務的相關功能了.

為什麼可以ServiceManager那裡拿到其他系統服務的BpBinder呢?

android的系統服務在系統啟動的時候,就啟動起來了,然後將自己註冊到ServiceManager那裡去了.以後其他程式要使用系統服務 ,就需要通過ServiceManager這個管家了.

最後截取了柯元旦的書<<android 核心剖析>>這本書關於binder的一些文字

Binder架構由服務端,binder驅動,客戶端三個部分構成:

其中服務端,客戶端處在使用者空間,而binder驅動處在核心空間。

伺服器端。一個Binder伺服器端就是一個Binder類的物件。當建立一個Binder物件後,內部就會開啟一個執行緒,這個執行緒用於接收binder驅動傳送的資訊,收到訊息後,會執行相關的服務程式碼。、

Binder驅動。當服務端成功建立一個Binder物件後,Binder驅動也會相應建立一個mRemote物件,該物件的型別也是Binder類。客戶就可以藉助這個mRemote物件來訪問遠端服務。

客戶端。客戶端要想訪問Binder的遠端服務,就必須獲取遠端服務的Binder物件在binder驅動層對應的mRemote引用。當獲取到mRemote物件的引用後,就可以呼叫相應Binder物件的服務了。

上面所說的mRemote引用 就是BpBinder了.

以上用通俗的詞語來表達binder通訊機制 應用在系統服務這一模組上.

下一篇部落格 講述在binder通訊機制在java應用層的應用