先簡單概括性地說說Linux現(xiàn)有的所有進程間IPC方式:
- 管道:在創(chuàng)建時分配一個page大小的內(nèi)存搂捧,緩存區(qū)大小比較有限贸营;
- 消息隊列:信息復(fù)制兩次骆捧,額外的CPU消耗岖常;不合適頻繁或信息量大的通信侍筛;
- 共享內(nèi)存:無須復(fù)制萤皂,共享緩沖區(qū)直接付附加到進程虛擬地址空間,速度快匣椰;但進程間的同步問題操作系統(tǒng)無法實現(xiàn)裆熙,必須各進程利用同步工具解決;
- 套接字:作為更通用的接口窝爪,傳輸效率低弛车,主要用于不通機器或跨網(wǎng)絡(luò)的通信;
Android的內(nèi)核也是基于Linux內(nèi)核蒲每,為何不直接采用Linux現(xiàn)有的進程IPC方案呢
****從5個角度來展開對Binder的分析:****
(1)從性能的角度
數(shù)據(jù)拷貝次數(shù):Binder數(shù)據(jù)拷貝只需要一次纷跛,而管道、消息隊列邀杏、Socket都需要2次贫奠,但共享內(nèi)存方式一次內(nèi)存拷貝都不需要唬血;從性能角度看,Binder性能僅次于共享內(nèi)存唤崭。
(2)從穩(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)方式復(fù)雜酸茴,沒有客戶與服務(wù)端之別分预, 需要充分考慮到訪問臨界資源的并發(fā)同步問題,否則可能會出現(xiàn)死鎖等問題薪捍;從這穩(wěn)定性角度看笼痹,Binder架構(gòu)優(yōu)越于共享內(nèi)存。僅僅從以上兩點酪穿,各有優(yōu)劣凳干,還不足以支撐google去采用binder的IPC機制,那么更重要的原因是:
(3)從安全的角度
傳統(tǒng)Linux IPC的接收方無法獲得對方進程可靠的UID/PID被济,從而無法鑒別對方身份纺座;而Android作為一個開放的開源體系,擁有非常多的開發(fā)平臺溉潭,App來源甚廣,因此手機的安全顯得額外重要少欺;對于普通用戶喳瓣,絕不希望從App商店下載偷窺隱射數(shù)據(jù)、后臺造成手機耗電等等問題赞别,傳統(tǒng)Linux IPC無任何保護措施畏陕,完全由上層協(xié)議來確保。Android為每個安裝好的應(yīng)用程序分配了自己的UID仿滔,故進程的UID是鑒別進程身份的重要標(biāo)志惠毁,前面提到C/S架構(gòu),Android系統(tǒng)中對外只暴露Client端崎页,Client端將任務(wù)發(fā)送給Server端鞠绰,Server端會根據(jù)權(quán)限控制策略,判斷UID/PID是否滿足訪問權(quán)限飒焦,目前權(quán)限控制很多時候是通過彈出權(quán)限詢問對話框蜈膨,讓用戶選擇是否運行屿笼。Android 6.0,也稱為Android M翁巍,在6.0之前的系統(tǒng)是在App第一次安裝時驴一,會將整個App所涉及的所有權(quán)限一次詢問,只要留意看會發(fā)現(xiàn)很多App根本用不上通信錄和短信灶壶,但在這一次性權(quán)限權(quán)限時會包含進去肝断,讓用戶拒絕不得,因為拒絕后App無法正常使用驰凛,而一旦授權(quán)后胸懈,應(yīng)用便可以胡作非為。針對這個問題洒嗤,google在Android M做了調(diào)整箫荡,不再是安裝時一并詢問所有權(quán)限,而是在App運行過程中渔隶,需要哪個權(quán)限再彈框詢問用戶是否給相應(yīng)的權(quán)限羔挡,對權(quán)限做了更細地控制,讓用戶有了更多的可控性间唉,但同時也帶來了另一個用戶詬病的地方绞灼,那也就是權(quán)限詢問的彈框的次數(shù)大幅度增多。對于Android M平臺上呈野,有些App開發(fā)者可能會寫出讓手機異常頻繁彈框的App低矮,企圖直到用戶授權(quán)為止,這對用戶來說是不能忍的被冒,用戶最后吐槽的可不光是App军掂,還有Android系統(tǒng)以及手機廠商,有些用戶可能就跳果粉了昨悼,這還需要廣大Android開發(fā)者以及手機廠商共同努力蝗锥,共同打造安全與體驗俱佳的Android手機。Android中權(quán)限控制策略有SELinux等多方面手段率触,下面列舉從Binder的一個角度的權(quán)限控制:Android源碼的Binder權(quán)限是如何控制终议? -Gityuan的回答
傳統(tǒng)IPC只能由用戶在數(shù)據(jù)包里填入UID/PID;另外葱蝗,可靠的身份標(biāo)記只有由IPC機制本身在內(nèi)核中添加穴张。其次傳統(tǒng)IPC訪問接入點是開放的,無法建立私有通道两曼。從安全角度皂甘,Binder的安全性更高。說到這悼凑,可能有人要反駁叮贩,Android就算用了Binder架構(gòu)击狮,而現(xiàn)如今Android手機的各種流氓軟件,不就是干著這種偷窺隱射益老,后臺偷偷跑流量的事嗎彪蓬?沒錯,確實存在捺萌,但這不能說Binder的安全性不好档冬,因為Android系統(tǒng)仍然是掌握主控權(quán),可以控制這類App的流氓行為桃纯,只是對于該采用何種策略來控制酷誓,在這方面android的確存在很多有待進步的空間,這也是google以及各大手機廠商一直努力改善的地方之一态坦。在Android 6.0盐数,google對于app的權(quán)限問題作為較多的努力,大大收緊的應(yīng)用權(quán)限伞梯;另外玫氢,在Google舉辦的Android Bootcamp 2016大會中,google也表示在Android 7.0 (也叫Android N)的權(quán)限隱私方面會進一步加強加固谜诫,比如SELinux漾峡,Memory safe language(還在research中)等等,在今年的5月18日至5月20日喻旷,google將推出Android N生逸。話題扯遠了,繼續(xù)說Binder且预。
(4)從語言層面的角度
大家多知道Linux是基于C語言(面向過程的語言)槽袄,而Android是基于Java語言(面向?qū)ο蟮恼Z句),而對于Binder恰恰也符合面向?qū)ο蟮乃枷敕嫘常瑢⑦M程間通信轉(zhuǎn)化為通過對某個Binder對象的引用調(diào)用該對象的方法掰伸,而其獨特之處在于Binder對象是一個可以跨進程引用的對象,它的實體位于一個進程中怀估,而它的引用卻遍布于系統(tǒng)的各個進程之中『辖粒可以從一個進程傳給其它進程多搀,讓大家都能訪問同一Server,就像將一個對象或引用賦值給另一個引用一樣灾部。Binder模糊了進程邊界康铭,淡化了進程間通信過程,整個系統(tǒng)仿佛運行于同一個面向?qū)ο蟮某绦蛑卸乃琛恼Z言層面从藤,Binder更適合基于面向?qū)ο笳Z言的Android系統(tǒng)催跪,對于Linux系統(tǒng)可能會有點“水土不服”。另外夷野,Binder是為Android這類系統(tǒng)而生懊蒸,而并非Linux社區(qū)沒有想到Binder IPC機制的存在,對于Linux社區(qū)的廣大開發(fā)人員悯搔,我還是表示深深佩服骑丸,讓世界有了如此精湛而美妙的開源系統(tǒng)。也并非Linux現(xiàn)有的IPC機制不夠好妒貌,相反地通危,經(jīng)過這么多優(yōu)秀工程師的不斷打磨,依然非常優(yōu)秀灌曙,每種Linux的IPC機制都有存在的價值菊碟,同時在Android系統(tǒng)中也依然采用了大量Linux現(xiàn)有的IPC機制,根據(jù)每類IPC的原理特性在刺,因時制宜逆害,不同場景特性往往會采用其下最適宜的。比如在Android OS中的Zygote進程的IPC采用的是Socket(套接字)機制增炭,Android中的Kill Process采用的signal(信號)機制等等忍燥。而Binder更多則用在system_server進程與上層App層的IPC交互。
(5) 從公司戰(zhàn)略的角度
總所周知隙姿,Linux內(nèi)核是開源的系統(tǒng)梅垄,所開放源代碼許可協(xié)議GPL保護,該協(xié)議具有“病毒式感染”的能力输玷,怎么理解這句話呢队丝?受GPL保護的Linux Kernel是運行在內(nèi)核空間,對于上層的任何類庫欲鹏、服務(wù)机久、應(yīng)用等運行在用戶空間,一旦進行SysCall(系統(tǒng)調(diào)用)赔嚎,調(diào)用到底層Kernel膘盖,那么也必須遵循GPL協(xié)議。而Android 之父 Andy Rubin對于GPL顯然是不能接受的尤误,為此侠畔,Google巧妙地將GPL協(xié)議控制在內(nèi)核空間,將用戶空間的協(xié)議采用Apache-2.0協(xié)議(允許基于Android的開發(fā)商不向社區(qū)反饋源碼)损晤,同時在GPL協(xié)議與Apache-2.0之間的Lib庫中采用BSD證授權(quán)方法软棺,有效隔斷了GPL的傳染性,仍有較大爭議尤勋,但至少目前緩解Android喘落,讓GPL止步于內(nèi)核空間茵宪,這是Google在GPL Linux下 開源與商業(yè)化共存的一個成功典范。
有了這些鋪墊瘦棋,我們再說說Binder的今世前緣
Binder是基于開源的 OpenBinder實現(xiàn)的稀火,OpenBinder是一個開源的系統(tǒng)IPC機制,最初是由 Be Inc.** 開發(fā),接著由Palm, Inc.公司負責(zé)開發(fā)兽狭,現(xiàn)在OpenBinder的作者在Google工作憾股,既然作者在Google公司,在用戶空間采用Binder 作為核心的IPC機制箕慧,再用Apache-2.0協(xié)議保護服球,自然而然是沒什么問題,減少法律風(fēng)險颠焦,以及對開發(fā)成本也大有裨益的斩熊,那么從公司戰(zhàn)略角度,Binder也是不錯的選擇伐庭。另外粉渠,再說一點關(guān)于OpenBinder,在2015年OpenBinder以及合入到Linux Kernel主線 3.19版本圾另,這也算是Google對Linux的一點回饋吧霸株。綜合上述5點,可知Binder是Android系統(tǒng)上層進程間通信的不二選擇集乔。