Android IPC基礎之Binder 機制

IPC

概念 :進程間通信或跨進程通信,是指兩個進程之間進行數據交換的過程
起由 :兩個對象能直接相互訪問的前提是這兩個對象都存在於相同的內存地址空間中,如果兩個對象分別存在於兩個不同的進程中,那麼這兩個對象是不能直接相互調用的,需要跨進程通信技術

Binder 機制

Binder 是Android 中的一個類,它實現了IBinder 接口。Android 開發中,Binder 主要用在Service 中,包括AIDL 和Messenger ,其中普通Service中Binder不涉及進程間通信,而Messenger的底層其實是AIDL;所有可以在Binder中傳輸的接口都需要集成IInterface 接口

  • 從IPC 角度來說,Binder 是Android 中的一種跨進程通信方式,Binder 可以理解爲一種虛擬的物理設備,它的設備驅動是/dev/binder,該通信方式在Linux 中沒有
  • 從Android Framework 角度來說,Binder 是ServiceManager 連接各種Manager(ActivityManager、WindowManager等等)和相應ManagerService 的橋樑
  • 從Android 應用層來說,Binder 是客戶端與服務器進行通信的媒介,當bindService的時候,服務器端會返回一個包含了服務器端業務調用的Binder對象,通過這個Binder對象,客戶端就可以獲取服務器端提供的服務或者數據,這裏的服務包括普通服務器和基於AIDL的服務

Binder 組成

Binder 所涉及的四個重要模塊:Client、Server、Server Manager 和Binder Driver
在這裏插入圖片描述
圖解

  1. Binder Driver 位於內核空間中,以字符設備中的misc類型註冊,通過open 和ioctl 文件操作函數與Binder Driver 進行通信,主要負責Binder 通信建立,以及其在進程間的傳遞和Binder 引用計數管理/數據包管理
  2. Binder Client 與 Binder Server之間的跨進程通信則統一通過Binder Driver 處理轉發
  3. Binder Client 使用的Binder 的name 以及該Binder 實體在ServerManager 中0號引用,通過0號引用去訪問Server Manager獲取該Binder 引用(Binder 引用就是由Server Manager 來轉換的),就可以調用Binder 實體方法;Binder Client通過 ServerManager來查詢Binder Server 接口。
  4. Binder Server 在生成一個Binder 實體的同時會爲其綁定一個名字並將這個名字封裝成一個數據包傳遞給Binder Driver,Binder Driver接收到這個數據包後,如果發現這個Binder 是新傳遞過來的,就會爲其在內核空間中Binder實體節點(Binder_node)和一個實體節點引用(Binder_ref),創建完畢後,Binder Driver就會將該引用傳遞給ServerManager ,ServerManager收到後就會從中取出該Binder 的名字和引用插入一張數據表中。

注意: ServerManager 是一個標準的Binder Server,並且在Android中約定其在Binder通信過程中唯一標識是0

ServerManager

主要功能是將Binder以字符表示的名字轉換爲一個引用

 public interface IServiceManager extends IInterface
30{
31    
36    IBinder getService(String name) throws RemoteException;
38  
42    IBinder checkService(String name) throws RemoteException;
43
48    void addService(String name, IBinder service, boolean allowIsolated, int dumpFlags)
49            throws RemoteException;
50
54    String[] listServices(int dumpFlags) throws RemoteException;

60    void setPermissionController(IPermissionController controller)
61            throws RemoteException;
62
63    static final String descriptor = "android.os.IServiceManager";
64
65    int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
66    int CHECK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;
67    int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
68    int LIST_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;
69    int CHECK_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;
70    int SET_PERMISSION_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5;
90}

對於在 Client 端的ServiceManagerNative 和ServiceManagerProxy 則實現這個接口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章