Binder是Android中的一種跨進程通信方式。從Android Framework 角度來說Binder是ServiceManager連接各種Manager(ActivityManager、WindowManager等等)和相應ManagerService的橋樑;從Android應用層來說Binder是客服端與服務端進行通信的媒介。下面 對 Binder 面試知識基本面試知識的做個小結,方便後期知識的回顧、補充。
推薦博文:
簡單明瞭,徹底地理解Binder
Android進程間通信(IPC)機制Binder簡要介紹和學習計劃
1、 Linux 內核基礎知識
進程隔離/虛擬地址空間:
進程間是相互獨立的,數據不能共享,互不干擾,不同的進程分配在不同的虛擬地址空間中。系統調用:
對內核保護,只對應用程序開放許可的資源;允許應用程序通過系統調用調用內核的部分開放程序。binder驅動:負責各個應用進程間,通過binder通信內核來進行交互的模塊。
3、爲什麼使用Binder
- 性能:相比傳統的Socket更高效。
- 安全:安全性高,支持通信雙方進行身份驗證。
4、Binder通信模型
1、註冊建立ServiceManager表。
2、Service1、Service2通過Binder驅動申請註冊到ServiceManager中。
3、Client需要與Service2進行通信,跨進程無法直接通信,需要先通過ServiceManger中查詢到Service2。藉助Binder驅動返回一個Service2的代理對象。Client直接跟Service2代理對象進行操作,通過Binder驅動映射操作Service2真實對象,從而完成通信。
5、Binder跨進程通信
- Service向SM查找表中註冊了Object對象的add()方法;
- Client想調用Service中Object對象的add()方法,需要通過Binder驅動向SM查找表中查詢是否有Object對象的add()方法,有則返回Client一個Object對象的代理對象Proxy ;
- Client 調用代理對象Proxy的add()方法,Binder驅動進行接收處理去調用真實對象Object的add()方法;
- Object的add()方法執行後返回結果給SM,SM通過Binder驅動將結果返回給Client。
小結:
客戶端進程只是持有了服務端進程的一個代理,通過代理對象協助驅動完成跨進程通信。
6、什麼是Binder?
- Binder是一種通信機制;
- 對於Service來說Binder指的是Binder本地對象,對於Client來說Binder指的是Binder的代理對象;
- 對於傳輸過程而言,Binder是可以跨進程傳遞的對象。
7、AIDL
支持的數據傳遞類型:
基本數據類型(short 除外)、String、charSequehce、List(元素得序列化)、Map(元素得序列化)、parcelable。應用場景:
AIDL: IPC、多個應用程序、多線程;
Binder: IPC、多個應用程序、沒有多線程;
Messager: IPC、沒有多線程;通信過程:
- 客戶端通過aidl文件生成的java類 中的Stub.asInterface()方法,得到Proxy代理類
- 通過調用Proxy代理類的方法,將參數進行打包後,調用IBinder 的transact()方法,交給底層處理,再回調onTransact()方法,將參數進行解包,調用服務端對應的方法,並將執行結果返回。