在開始回答前,先簡單概括性地說說Linux現有的所有進程間IPC方式:
1. **管道:**在創建時分配一個page大小的內存,緩存區大小比較有限;
2. 消息隊列:信息復制兩次,額外的CPU消耗;不合適頻繁或信息量大的通信;
3. 共享內存:無須復制,共享緩沖區直接付附加到進程虛擬地址空間,速度快;但進程間的同步問題操作系統無法實現,必須各進程利用同步工具解決;
4. 套接字:作為更通用的接口,傳輸效率低,主要用于不通機器或跨網絡的通信;
5. 信號量:常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
6. 信號: 不適用于信息交換,更適用于進程中斷控制,比如非法內存訪問,殺死某個進程等;
Android的內核也是基于Linux內核,為何不直接采用Linux現有的進程IPC方案呢,難道Linux社區那么多優秀人員都沒有考慮到有Binder這樣一個更優秀的方案,是google太過于牛B嗎?事實是真相并非如此,請細細往下看,您就明白了。
接下來正面回答這個問題,從5個角度來展開對Binder的分析:
(1)從性能的角度 **數據拷貝次數:**Binder數據拷貝只需要一次,而管道、消息隊列、Socket都需要2次,但共享內存方式一次內存拷貝都不需要;從性能角度看,Binder性能僅次于共享內存。
(2)從穩定性的角度
Binder是基于C/S架構的,簡單解釋下C/S架構,是指客戶端(Client)和服務端(Server)組成的架構,Client端有什么需求,直接發送給Server端去完成,架構清晰明朗,Server端與Client端相對獨立,穩定性較好;而共享內存實現方式復雜,沒有客戶與服務端之別, 需要充分考慮到訪問臨界資源的并發同步問題,否則可能會出現死鎖等問題;從這穩定性角度看,Binder架構優越于共享內存。
僅僅從以上兩點,各有優劣,還不足以支撐google去采用binder的IPC機制,那么更重要的原因是:
(3)從安全的角度
傳統Linux IPC的接收方無法獲得對方進程可靠的UID/PID,從而無法鑒別對方身份;而Android作為一個開放的開源體系,擁有非常多的開發平臺,App來源甚廣,因此手機的安全顯得額外重要;對于普通用戶,絕不希望從App商店下載偷窺隱射數據、后臺造成手機耗電等等問題,傳統Linux IPC無任何保護措施,完全由上層協議來確保。
Android為每個安裝好的應用程序分配了自己的UID,故進程的UID是鑒別進程身份的重要標志,前面提到C/S架構,Android系統中對外只暴露Client端,Client端將任務發送給Server端,Server端會根據權限控制策略,判斷UID/PID是否滿足訪問權限,目前權限控制很多時候是通過彈出權限詢問對話框,讓用戶選擇是否運行。Android 6.0,也稱為Android M,在6.0之前的系統是在App第一次安裝時,會將整個App所涉及的所有權限一次詢問,只要留意看會發現很多App根本用不上通信錄和短信,但在這一次性權限權限時會包含進去,讓用戶拒絕不得,因為拒絕后App無法正常使用,而一旦授權后,應用便可以胡作非為。
針對這個問題,google在Android M做了調整,不再是安裝時一并詢問所有權限,而是在App運行過程中,需要哪個權限再彈框詢問用戶是否給相應的權限,對權限做了更細地控制,讓用戶有了更多的可控性,但**同時也帶來了另一個用戶詬病的地方,那也就是權限詢問的彈框的次數大幅度增多。**對于Android M平臺上,有些App開發者可能會寫出讓手機異常頻繁彈框的App,企圖直到用戶授權為止,這對用戶來說是不能忍的,用戶最后吐槽的可不光是App,還有Android系統以及手機廠商,有些用戶可能就跳果粉了,這還需要廣大Android開發者以及手機廠商共同努力,共同打造安全與體驗俱佳的Android手機。
總結
Android架構學習進
《安卓學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》瀏覽器打開
完整開源項目:docs.qq.com/doc/DSkNLaERkbnFoS0ZF
階是一條漫長而艱苦的道路,不能靠一時激情,更不是熬幾天幾夜就能學好的,必須養成平時努力學習的習慣。所以:貴在堅持!
上面分享的字節跳動公司2021年的面試真題解析大全,筆者還把一線互聯網企業主流面試技術要點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節。
【Android高級架構視頻學習資源】
Android部分精講視頻領取學習后更加是如虎添翼!進軍BATJ大廠等(備戰)!現在都說互聯網寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎么可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程序員泛濫,這套教程針對Android開發工程師1-6年的人員、正處于瓶頸期,想要年后突破自己漲薪的,進階Android中高級、架構師對你更是如魚得水,趕快領取吧!
處于瓶頸期,想要年后突破自己漲薪的,進階Android中高級、架構師對你更是如魚得水,趕快領取吧!
本文已被CODING開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》收錄