「Android」 基於Binder通訊的C/S架構體系認知

  C/S架構(Client/Server,即客戶機/服務器模式)分爲客戶機和服務器兩層:第一層是在客戶機系統上結合了表示與業務邏輯,第二層是經過網絡結合了數據庫服務器。簡單的說就是第一層是用戶表示層,第二層是數據庫層。客戶端和服務器直接相連,這兩個組成部分都承擔着重要的角色。數據庫

 

  Android內核是基於Linux系統, 而Linux現存多種進程間IPC方式:管道, 消息隊列, 共享內存, 套接字, 信號量, 信號。而Android用的是Binder來進行進程間通訊。服務器

  Binder是Android系統提供的一種IPC(進程間通訊)機制。對於Android系統,咱們基本上能夠把它看作一個基於Binder通訊的C/S架構,Binder就像網絡同樣,把系統的各個部分鏈接在了一塊兒,所以它是很是重要的。在Android系統的C/S架構中除了Client端和Server端外,還有一個全局的ServiceManager端,其做用是管理系統中的各類服務,三者的關係以下圖:網絡

  

  

一、Binder的通訊結構分爲三層,以下圖所示:

 

二、Server

Server的工做示意圖以下:架構

下面是對上圖的每一個步驟的解釋(在SurfaceFlinger的入口main函數的時候分析過):函數

一、初始化processState:在初始化的過程當中咱們打開了binder虛擬設備,並使用mmap爲其分配了內存,因爲processState是一個用了單例模式實現的類,所以每一個進程只會打開設備一次;
二、getDefaultServiceManager:顧名思義,獲取ServiceManager。因爲Server此時是做爲客戶端,所以獲得了BpServiceManager,BpServiceManager中含有BpBinder,其傳入的handle爲0,表明ServiceManager的BBinder;
三、instantiate:使用BpServiceManager的addService方法註冊服務,以字符串標識本身的服務;
四、startThreadPool:這是一個可選的操做,當系統認爲服務可能較爲繁忙時纔會建立多個線程,會爲每一個線程設置IPCThreadState(用於通訊),建立完後調用joinThreadPool
五、joinThreadPool:把當前線程加入線程池中,監聽來自客戶端的請求並處理,獲得請求後經過executeCommand方法來處理;
 oop

三、ServiceManager

ServiceManager的工做示意圖以下:spa

ServiceManger的工做只有3步線程

binder_open:打開binder設備,與Server在processState初始化時進行的操做相似;
binder_become_contextt_manager:經過ioctl把本身的handle值設置爲0,表明獨一無二的Manager;
binder_loop:進入一個循環監聽請求,並做出響應的處理;3d


注:不是全部Server進程都能往ServiceManager中註冊服務的,只有root或system級別的進程纔有註冊服務的權限。但ServiceManager中還維護了一個allowed的白名單,上面註明了那些服務是容許被註冊的,這些服務能夠被任意Server進程註冊。blog

 

四、Client

Client使用服務只須要分爲兩步就好:
  (1)經過defaultServiceManager方法獲取ServiceManager;
  (2)經過ServiceManager的getService方法傳入字符串獲取相應的服務並操做;

相關文章
相關標籤/搜索