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