android程序間通訊之Binder學習筆記(一)
Binder
Binder 是一種程序間通訊機制,基於開源的 OpenBinder 實現;OpenBinder 起初由 Be Inc. 開發,後由 Plam Inc. 接手。
從字面上來解釋 Binder 有膠水、粘合劑的意思,顧名思義就是粘和不同的程序,使之實現通訊。
Android系統是基於Linux系統的,理論上應該使用Linux內建的IPC方式。Linux中的IPC方式有管道、訊號量、共享記憶體、訊息佇列、Socket,Android使用的Binder機制不屬於Linux。
Android不繼承Linux中原有的IPC方式,而選擇使用Binder,說明Binder具有一定的優勢。
為什麼使用Binder
- 通訊方式 程式設計過程中,常常會用到Client-Server的通訊方式,但在Linux的五種IPC機制中,只有Socket支援這種通訊方式。
- 傳輸效能 Socket作為一款通用介面,其傳輸效率低,開銷大,主要用在跨網路的程序間通訊和本機上程序間的低速通訊;訊息佇列和管道採用儲存-轉發方式,即資料先從傳送方拷貝到記憶體開闢的快取區中,然後再從核心快取區拷貝到接收方快取區,至少有兩次拷貝過程;共享記憶體雖然無需拷貝,但控制複雜,難以使用;而Binder只需要拷貝一次;
- 安全性 Android作為一個開放式的平臺,應用程式的來源廣泛,因此確保只能終端的安全是非常重要的。Linux傳統的IPC沒有任何安全措施,完全依賴上層協議來確保,具體有以下兩點表現:
第一,傳統IPC的接收方無法獲得對方可靠的UID/PID(使用者ID/程序ID),從而無法鑑別對方身份,使用傳統IPC時只能由使用者在資料包裡填入UID/PID,但這樣不可靠,容易被惡意程式利用;
第二,傳統IPC的訪問接入點是開放的,無法建立私有通訊,只要知道這些接入點的程式都可以和對端建立連線,這樣無法阻止惡意程式通過猜測接收方的地址獲得連線。
Binder 通訊原理

image.png
Binder主要分為四個模組:
- Client程序 客戶端,例如各個app
- Server程序 伺服器
- Binder驅動 驅動,執行在核心態
- ServiceManager 伺服器管理程序
Binder驅動 和 Service Manager程序 屬於 Android基礎架構(即系統已經實現好了);而Client 程序 和 Server 程序 屬於Android應用層(需要開發者自己實現)。
service manager
Service Manager是一個linux級的程序,顧名思義,就是service的管理器。
這裡的service的概念和init過程中init.rc中的service是不同,init.rc中的service是都是linux程序,但是這裡的service它並不一定是一個程序,也就是說可能一個或多個service屬於同一個linux程序。
任何service在被使用之前,均要向SM(Service Manager)註冊,同時客戶端需要訪問某個service時,應該首先向SM查詢是否存在該服務。
如果SM存在這個service,那麼會將該service的handle返回給client,handle是每個service的唯一識別符號。
SM的入口函式在service_manager.c中,用興趣的可以檢視下。
int main(int argc, char **argv) { struct binder_state *bs; void *svcmgr = BINDER_SERVICE_MANAGER; bs = binder_open(128*1024); if (binder_become_context_manager(bs)) { LOGE("cannot become context manager (%s)/n", strerror(errno)); return -1; } svcmgr_handle = svcmgr; binder_loop(bs, svcmgr_handler); return 0; }
這裡不在過多解釋,本篇只介紹如何使用Binder
Binder驅動
Binder驅動是Binder機制中進行程序間通訊的介質。
Binder驅動會對具有跨程序傳遞能力的物件做特殊處理,自動完成代理物件和本地物件的轉換。 說白了就是一種地址對映。
具體機制來自於一遍部落格,在參考中已經列出,畫的很詳細:

image.png
通訊步驟
使用Binder實現通訊大致分為四步:
1.註冊服務(將伺服器端註冊到ServiceManager)
2.獲取服務(客戶端獲取服務端資訊)
3.使用服務(j呼叫返回的代理伺服器,向伺服器端傳送資料)
4.接受服務(伺服器端,即可接受到資料,實現通訊過程)
參考
ofollow,noindex">Android跨程序通訊:圖文詳解 Binder機制 原理
一篇文章瞭解相見恨晚的 Android Binder 程序間通訊機制