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應用層的應用