(轉(zhuǎn))https://blog.csdn.net/superjunjin/article/details/80181873
1、什么是Binder
- 直觀來說泪漂,Binder是Android中的一個類,它繼承了IBinder接口
- 從IPC角度來說犁嗅,Binder是Android中的一種跨進程通信方式硝拧,Binder還可以理解為一種虛擬的物理設(shè)備溺忧,它的設(shè)備驅(qū)動是/dev/binder微渠,該通信方式在linux中沒有
- 從Android Framework角度來說霎苗,Binder是ServiceManager連接各種Manager(ActivityManager、WindowManager已艰,etc)和相應(yīng)ManagerService的橋梁
- 從Android應(yīng)用層來說痊末,Binder是客戶端和服務(wù)端進行通信的媒介,當你bindService的時候哩掺,服務(wù)端會返回一個包含了服務(wù)端業(yè)務(wù)調(diào)用的Binder對象凿叠,通過這個Binder對象,客戶端就可以獲取服務(wù)端提供的服務(wù)或者數(shù)據(jù)嚼吞,這里的服務(wù)包括普通服務(wù)和基于AIDL的服務(wù)
2盒件、為什么要使用Binder?
在傳統(tǒng)的Linux上舱禽,我們還是有很多選擇可以用來實現(xiàn)進程間通信炒刁,如管道、消息隊列呢蔫、Socket等切心。那么Android為什么不使用這些原有的技術(shù)飒筑,而是要使開發(fā)一種新的叫Binder的進程間通信機制呢片吊?
1、性能方面
在移動設(shè)備上(性能受限制的設(shè)備协屡,比如要省電)俏脊,廣泛地使用跨進程通信對通信機制的性能有嚴格的要求,Binder相對出傳統(tǒng)的Socket方式肤晓,更加高效爷贫。Binder數(shù)據(jù)拷貝只需要一次认然,而管道、消息隊列漫萄、Socket都需要2次卷员,共享內(nèi)存方式一次內(nèi)存拷貝都不需要,但實現(xiàn)方式又比較復雜腾务。
2毕骡、安全方面
傳統(tǒng)的進程通信方式對于通信雙方的身份并沒有做出嚴格的驗證,比如Socket通信ip地址是客戶端手動填入岩瘦,很容易進行偽造未巫,而Binder機制從協(xié)議本身就支持對通信雙方做身份校檢,因而大大提升了安全性启昧,每個進程都會被Android系統(tǒng)分配UID和PID叙凡。
3、從穩(wěn)定性的角度
Binder是基于C/S架構(gòu)的密末,簡單解釋下C/S架構(gòu)握爷,是指客戶端(Client)和服務(wù)端(Server)組成的架構(gòu),Client端有什么需求严里,直接發(fā)送給Server端去完成饼拍,架構(gòu)清晰明朗,Server端與Client端相對獨立田炭,穩(wěn)定性較好师抄;而共享內(nèi)存實現(xiàn)方式復雜,沒有客戶與服務(wù)端之別教硫, 需要充分考慮到訪問臨界資源的并發(fā)同步問題叨吮,否則可能會出現(xiàn)死鎖等問題;從這穩(wěn)定性角度看瞬矩,Binder架構(gòu)優(yōu)越于共享內(nèi)存茶鉴。
3.Binder機制 在Android中的具體實現(xiàn)原理
Client進程、Server進程 & Service Manager 進程(用戶空間)之間的交互 都必須通過Binder(內(nèi)核空間)驅(qū)動(使用 open 和 ioctl文件操作函數(shù))景用,而非直接交互