標籤:
在Android系統,每個應用程式是由多個Activity和Service組件,這些Activity和Service有可能在相同的處理被執行,此外,還可以在不同的過程中進行。
然後。不是在同一個過程Activity或者Service是怎樣通訊的呢?這就是本文中要介紹的Binder處理序間通訊機制了。
我們知道,Android系統是基於Linux核心的,而Linux核心繼承和相容了豐富的Unix系統處理序間通訊(IPC)機制。
有傳統的管道(Pipe)、訊號(Signal)和跟蹤(Trace)。這三項通訊手段僅僅能用於父進程與子進程之間,或者兄弟進程之間。後來又添加了命令管道(Named Pipe)。使得處理序間通訊不再局限於父子進程或者兄弟進程之間;為了更好地支援商業應用中的交易處理,在AT&T的Unix系統V中。又添加了三種稱為“System V IPC”的處理序間通訊機制。各自是報文隊列(Message)、共用記憶體(Share Memory)和訊號量(Semaphore)。後來BSD Unix對“System V IPC”機制進行了重要的擴充。提供了一種稱為插口(Socket)的處理序間通訊機制。若想進一步具體瞭解這些處理序間通訊機制,建議參考Android學習啟動篇一文中提到《Linux核心源碼情景分析》一書。
可是。Android系統沒有採用上述提到的各種處理序間通訊機制。而是採用Binder機制,難道是由於考慮到了行動裝置硬體效能較差、記憶體較低的特點?不得而知。
Binder事實上也不是Android提出來的一套新的處理序間通訊機制。它是基於OpenBinder來實現的。OpenBinder最先是由Be Inc.開發的,接著Palm Inc.也跟著使用。如今OpenBinder的作者Dianne Hackborn就是在Google工作。負責Android平台的開發工作。
前面一再提到,Binder是一種處理序間通訊機制,它是一種相似於COM和CORBA分布式組件架構,通俗一點,事實上是提供遠端程序呼叫(RPC)功能。從英文字面上意思看,Binder具有粘結劑的意思,那麼它把什麼東西粘結在一起呢?在Android系統的Binder機制中。由一系統組件組成,各自是Client、Server、Service Manager和Binder驅動程式,當中Client、Server和Service Manager執行在使用者空間,Binder驅動程式執行核心空間。Binder就是一種把這四個組件粘合在一起的粘結劑了,當中。核心組件便是Binder驅動程式了,Service Manager提供了輔助管理的功能。Client和Server正是在Binder驅動和Service Manager提供的基礎設施上,進行Client-Server之間的通訊。
Service Manager和Binder驅動已經在Android平台中實現好,開發人員僅僅要依照規範實現自己的Client和Server組件就行了。說起來簡單,做起難,對剛開始學習的人來說,Android系統的Binder機制是最難理解的了,而Binder機制不管從系統開發還是應用開發的角度來看。都是Android系統中最重要的組成。因此。非常有必要深入瞭解Binder的工作方式。要深入瞭解Binder的工作方式,最好的方式莫過於是閱讀Binder相關的源碼了,Linux的鼻祖Linus Torvalds以前曰過一句名言RTFSC:Read The Fucking Source Code。
雖說閱讀Binder的源碼是學習Binder機制的最好的方式。可是也絕不能打無準備之仗,由於Binder的相關源碼是比較枯燥無味並且比較難以理解的,假設可以輔予一些理論知識,那就更好了。閑話少說,網上關於Binder機制的資料還是不少的,這裡就不想再具體寫一遍了。強烈推薦以下兩篇文章:
Android深入淺出之Binder機制
Android Binder設計與實現 – 設計篇
Android深入淺出之Binder機制一文從情景出發。深入地介紹了Binder在使用者空間的三個組件Client、Server和Service Manager的相互關係。Android Binder設計與實現一文則是具體地介紹了核心空間的Binder驅動程式的資料結構和設計原理。非常感謝這兩位作者給我們帶來這麼好的Binder學習資料。總結一下。Android系統Binder機制中的四個組件Client、Server、Service Manager和Binder驅動程式的關係例如以所看到的:
1. Client、Server和Service Manager實如今使用者空間中,Binder驅動程式實如今核心空間中
2. Binder驅動程式和Service Manager在Android平台中已經實現。開發人員僅僅須要在使用者空間實現自己的Client和Server
3. Binder驅動程式提供裝置檔案/dev/binder與使用者空間互動,Client、Server和Service Manager通過open和ioctl檔案操作函數與Binder驅動程式進行通訊
4. Client和Server之間的處理序間通訊通過Binder驅動程式間接實現
5. Service Manager是一個守護進程。用來管理Server,並向Client提供查詢Server介面的能力
至此。對Binder機制總算是有了一個感性的認識,但仍然感到不能非常好地從上到下貫穿整個IPC通訊過程,於是。打算通過以下四個情景來分析Binder源碼,以進一步理解Binder機制:
1. Service Manager是怎樣成為一個守護進程的?即Service Manager是怎樣告知Binder驅動程式它是Binder機制的上下文管理者。
2. Server和Client是怎樣獲得Service Manager介面的?即defaultServiceManager介面是怎樣實現的。
3. Server是怎樣把自己的服務啟動起來的?Service Manager在Server啟動的過程中是怎樣為Server提供服務的?即IServiceManager::addService介面是怎樣實現的。
4 Service Manager是怎樣為Client提供服務的?即IServiceManager::getService介面是怎樣實現的。
在接下來的四篇文章中,將依照這四個情景來分析Binder源碼。都將會涉及到使用者空間到核心空間的Binder相關源碼。
這裡為什麼沒有Client和Server是怎樣進行處理序間通訊的情景呢? 這是由於Service Manager在作為守護進程的同一時候,它也充當Server角色。
因此。僅僅要我們可以理解第三和第四個情景,也就理解了Binder機制中Client和Server是怎樣通過Binder驅動程式進行處理序間通訊的了。
為了方便描寫敘述Android系統處理序間通訊Binder機制的原理和實現。在接下來的四篇文章中,我們都是基於C/C++語言來介紹Binder機制的實現的,可是,我們在Android系統開發應用程式時。都是基於Java語言的,因此。我們會在最後一篇文章中。具體介紹Android系統處理序間通訊Binder機制在應用程式架構層的Java介面實現:
5. Android系統處理序間通訊Binder機制在應用程式架構層的Java介面源碼分析。
新浪微博羅:http://weibo.com/shengyangluo,歡迎關注!
Android處理序間通訊(IPC)機制Binder簡介和學習計劃