android 开发艾特功能,Android Binder
Binder 是一種進(jìn)程間通信機(jī)制,基于開源的 OpenBinder 實現(xiàn);OpenBinder 起初由 Be Inc. 開發(fā),后由 Plam Inc. 接手。從字面上來解釋 Binder 有膠水、粘合劑的意思,顧名思義就是粘和不同的進(jìn)程,使之實現(xiàn)通信。
為什么 Activity 間傳遞對象需要序列化?
Activity 的啟動流程是什么樣的?
四大組件底層的通信機(jī)制是怎樣的?
AIDL 內(nèi)部的實現(xiàn)原理是什么?
插件化編程技術(shù)應(yīng)該從何學(xué)起?等等...
我們知道 Android 應(yīng)用程序是由 Activity、Service、Broadcast Receiver 和 Content Provide 四大組件中的一個或者多個組成的。有時這些組件運(yùn)行在同一進(jìn)程,有時運(yùn)行在不同的進(jìn)程。這些進(jìn)程間的通信就依賴于 Binder IPC 機(jī)制。不僅如此,Android 系統(tǒng)對應(yīng)用層提供的各種服務(wù)如:ActivityManagerService、PackageManagerService 等都是基于 Binder IPC 機(jī)制來實現(xiàn)的。
Android 系統(tǒng)是基于 Linux 內(nèi)核的,Linux 已經(jīng)提供了管道、消息隊列、共享內(nèi)存和 Socket 等 IPC 機(jī)制。那為什么 Android 還要提供 Binder 來實現(xiàn) IPC 呢?主要是基于性能、穩(wěn)定性和安全性幾方面的原因。
性能
首先說說性能上的優(yōu)勢。Socket 作為一款通用接口,其傳輸效率低,開銷大,主要用在跨網(wǎng)絡(luò)的進(jìn)程間通信和本機(jī)上進(jìn)程間的低速通信。消息隊列和管道采用存儲-轉(zhuǎn)發(fā)方式,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開辟的緩存區(qū)中,然后再從內(nèi)核緩存區(qū)拷貝到接收方緩存區(qū),至少有兩次拷貝過程。共享內(nèi)存雖然無需拷貝,但控制復(fù)雜,難以使用。Binder 只需要一次數(shù)據(jù)拷貝,性能上僅次于共享內(nèi)存。
IPC方式
數(shù)據(jù)拷貝次數(shù)
共享內(nèi)存
0
Binder
1
Socket/管道/消息隊列
2
穩(wěn)定性
再說說穩(wěn)定性,Binder 基于 C/S 架構(gòu),客戶端(Client)有什么需求就丟給服務(wù)端(Server)去完成,架構(gòu)清晰、職責(zé)明確又相互獨(dú)立,自然穩(wěn)定性更好。共享內(nèi)存雖然無需拷貝,但是控制負(fù)責(zé),難以使用。從穩(wěn)定性的角度講,Binder 機(jī)制是優(yōu)于內(nèi)存共享的。
安全性
另一方面就是安全性。Android 作為一個開放性的平臺,市場上有各類海量的應(yīng)用供用戶選擇安裝,因此安全性對于 Android 平臺而言極其重要。作為用戶當(dāng)然不希望我們下載的 APP 偷偷讀取我的通信錄,上傳我的隱私數(shù)據(jù),后臺偷跑流量、消耗手機(jī)電量。傳統(tǒng)的 IPC 沒有任何安全措施,完全依賴上層協(xié)議來確保。首先傳統(tǒng)的 IPC 接收方無法獲得對方可靠的進(jìn)程用戶ID/進(jìn)程ID(UID/PID),從而無法鑒別對方身份。Android 為每個安裝好的 APP 分配了自己的 UID,故而進(jìn)程的 UID 是鑒別進(jìn)程身份的重要標(biāo)志。傳統(tǒng)的 IPC 只能由用戶在數(shù)據(jù)包中填入 UID/PID,但這樣不可靠,容易被惡意程序利用。可靠的身份標(biāo)識只有由 IPC 機(jī)制在內(nèi)核中添加。其次傳統(tǒng)的 IPC 訪問接入點是開放的,只要知道這些接入點的程序都可以和對端建立連接,不管怎樣都無法阻止惡意程序通過猜測接收方地址獲得連接。同時 Binder 既支持實名 Binder,又支持匿名 Binder,安全性高。
基于上述原因,Android 需要建立一套新的 IPC 機(jī)制來滿足系統(tǒng)對穩(wěn)定性、傳輸性能和安全性方面的要求,這就是 Binder。
最后用一張表格來總結(jié)下 Binder 的優(yōu)勢:
優(yōu)勢
描述
性能
只需要一次拷貝數(shù)據(jù),性能上僅次于共享內(nèi)存
穩(wěn)定性
基于C/S架構(gòu),職責(zé)明確,架構(gòu)清晰,穩(wěn)定性好
安全性
為每個進(jìn)程分配UID,進(jìn)程的UID是區(qū)分進(jìn)程身份的重要標(biāo)志
基本概念介紹
這里我們先從 Linux 中進(jìn)程間通信涉及的一些基本概念開始介紹,然后逐步展開,向大家說明傳統(tǒng)的進(jìn)程間通信的原理。
Linux基本概念介紹.png
上圖展示了 Liunx 中跨進(jìn)程通信涉及到的一些基本概念:
進(jìn)程隔離
進(jìn)程空間劃分:用戶空間(User Space)/內(nèi)核空間(Kernel Space)
系統(tǒng)調(diào)用:用戶態(tài)/內(nèi)核態(tài)
Linux 下的傳統(tǒng) IPC 通信原理
傳統(tǒng)的IPC通信原理
這種傳統(tǒng)的 IPC 通信方式有兩個問題:
1.性能低下,一次數(shù)據(jù)傳遞需要經(jīng)歷:內(nèi)存緩存區(qū) --> 內(nèi)核緩存區(qū) --> 內(nèi)存緩存區(qū),需要 2 次數(shù)據(jù)拷貝;
2.接收數(shù)據(jù)的緩存區(qū)由數(shù)據(jù)接收進(jìn)程提供,但是接收進(jìn)程并不知道需要多大的空間來存放將要傳遞過來的數(shù)據(jù),因此只能開辟盡可能大的內(nèi)存空間或者先調(diào)用 API 接收消息頭來獲取消息體的大小,這兩種做法不是浪費(fèi)空間就是浪費(fèi)時間。
總結(jié)
以上是生活随笔為你收集整理的android 开发艾特功能,Android Binder的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 闪回表操作语法+使用闪回删除
- 下一篇: android studio 无法输入中