C/S架構(Client/Server,即客戶機/伺服器模式)分為客戶機和伺服器兩層:第一層是在客戶機系統上結合了表示與業務邏輯,第二層是通過網路結合了資料庫伺服器。簡單的說就是第一層是用戶表示層,第二層是資料庫層。客戶端和伺服器直接相連,這兩個組成部分都承擔著重要的角色。 Android內核是基於 ...
C/S架構(Client/Server,即客戶機/伺服器模式)分為客戶機和伺服器兩層:第一層是在客戶機系統上結合了表示與業務邏輯,第二層是通過網路結合了資料庫伺服器。簡單的說就是第一層是用戶表示層,第二層是資料庫層。客戶端和伺服器直接相連,這兩個組成部分都承擔著重要的角色。
Android內核是基於Linux系統, 而Linux現存多種進程間IPC方式:管道, 消息隊列, 共用記憶體, 套接字, 信號量, 信號。而Android用的是Binder來進行進程間通信。
Binder是Android系統提供的一種IPC(進程間通信)機制。對於Android系統,我們基本上可以把它看做一個基於Binder通信的C/S架構,Binder就像網路一樣,把系統的各個部分連接在了一起,因此它是非常重要的。在Android系統的C/S架構中除了Client端和Server端外,還有一個全局的ServiceManager端,其作用是管理系統中的各種服務,三者的關係如下圖:
1、Binder的通信結構分為三層,如下圖所示:
2、Server
Server的工作示意圖如下:
下麵是對上圖的每個步驟的解釋(在SurfaceFlinger的入口main函數的時候分析過):
1、初始化processState:在初始化的過程中我們打開了binder虛擬設備,並使用mmap為其分配了記憶體,由於processState是一個用了單例模式實現的類,因此每個進程只會打開設備一次;
2、getDefaultServiceManager:顧名思義,獲取ServiceManager。由於Server此時是作為客戶端,因此得到了BpServiceManager,BpServiceManager中含有BpBinder,其傳入的handle為0,代表ServiceManager的BBinder;
3、instantiate:使用BpServiceManager的addService方法註冊服務,以字元串標識自己的服務;
4、startThreadPool:這是一個可選的操作,當系統認為服務可能較為繁忙時才會創建多個線程,會為每個線程設置IPCThreadState(用於通信),創建完後調用joinThreadPool
5、joinThreadPool:把當前線程加入線程池中,監聽來自客戶端的請求並處理,得到請求後通過executeCommand方法來處理;
3、ServiceManager
ServiceManager的工作示意圖如下:
ServiceManger的工作只有3步:
binder_open:打開binder設備,與Server在processState初始化時進行的操作類似;
binder_become_contextt_manager:通過ioctl把自己的handle值設置為0,代表獨一無二的Manager;
binder_loop:進入一個迴圈監聽請求,並作出響應的處理;
註:不是所有Server進程都能往ServiceManager中註冊服務的,只有root或system級別的進程才有註冊服務的許可權。但ServiceManager中還維護了一個allowed的白名單,上面註明瞭那些服務是允許被註冊的,這些服務可以被任意Server進程註冊。
4、Client
Client使用服務只需要分為兩步就好:
(1)通過defaultServiceManager方法獲取ServiceManager;
(2)通過ServiceManager的getService方法傳入字元串獲取相應的服務並操作;