溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android圖文詳解Binder進(jìn)程通信底層原理是什么

發(fā)布時間:2021-10-23 13:39:22 來源:億速云 閱讀:340 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Android圖文詳解Binder進(jìn)程通信底層原理是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Android圖文詳解Binder進(jìn)程通信底層原理是什么

? 什么是進(jìn)程間通信

進(jìn)程間通信(IPC,Inner Process Comunication),就是指不同進(jìn)程之間的信息傳遞。

進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)的結(jié)構(gòu)的基礎(chǔ);一個應(yīng)用至少有一個進(jìn)程,一個進(jìn)程中有包含了多個線程(線程是CPU調(diào)度的最小單位),進(jìn)程相當(dāng)于是線程的ViewGroup,線程相當(dāng)于操作系統(tǒng)分配個進(jìn)程的View。

? 什么是 Binder

Binder 是 Android 系統(tǒng)中進(jìn)程間通信機(jī)制(IPC)的一種方式,它是這些進(jìn)程間通訊的橋梁。正如其名"粘合劑"一樣,它把系統(tǒng)中各個組件粘合到了一起,是各個組件的橋梁。

應(yīng)用層:是一個能發(fā)起通信的Java類。

  • Client:是對 Binder 代理對象,是 Binder 實體對象的一個遠(yuǎn)程代理。

  • Server:是 Server 中的 Binder 實體對象。

機(jī)制:是一種進(jìn)程間通信機(jī)制。

驅(qū)動:是一個虛擬物理設(shè)備驅(qū)動;

如startActivity的簡圖:

Android圖文詳解Binder進(jìn)程通信底層原理是什么

這里就用到了 Binder 通信,你會發(fā)現(xiàn)這里還有 Socker 通信,那我為什么要用 Binder 而不用 Socket。

? Android 中 IPC 的方式

名稱特點使用場景
Bundle只能傳輸實現(xiàn)了序列化或者一些Android支持的特殊對象適合用于四大組件之間的進(jìn)程交互
文件不能做到進(jìn)程間的即時通信,并且不適合用于高并發(fā)的場景適合用于SharedPreference以及IO操作
ContentProvider可以訪問較多的數(shù)據(jù),支持一對多的高并發(fā)訪問,因為ContentProvider已經(jīng)自動做好了關(guān)于并發(fā)的機(jī)制適合用于一對多的數(shù)據(jù)共享并且需要對數(shù)據(jù)進(jìn)行頻繁的CRUD操作
Socket通過網(wǎng)絡(luò)傳輸字節(jié)流,支持一對多的實時通信,但是實現(xiàn)起來比較復(fù)雜適合用于網(wǎng)絡(luò)數(shù)據(jù)共享
Messenger底層原理是AIDL,只是對其做了封裝,但是不能很好的處理高并發(fā)的場景,并且傳輸?shù)臄?shù)據(jù)只能支持Bundle類型多進(jìn)程、單線程且線程安全
AIDL功能強(qiáng)大,使用Binder機(jī)制,支持一對多的高并發(fā)實時通信,但是需要處理好線程同步一對多并且有遠(yuǎn)程進(jìn)程通信的場景

? Binder 優(yōu)勢

出發(fā)點Binder共享內(nèi)存Socket
性能拷貝一次無需拷貝拷貝兩次
特點基于C/S架構(gòu),易用性高控制復(fù)雜,易用性差基于C/S架構(gòu),通用接口,傳輸效率低、開銷大
安全每個APP分配UID,同時支持實名和匿名依賴上層協(xié)議,訪問接入點是開放的不安全依賴上層協(xié)議,訪問接入點是開放的不安全

通過以上對比,Android 最終選擇了自建一套兼顧好用、高效、安全的 Binder。

  • 好用:基于C/S架構(gòu),易用性高

  • 高效:用 mmap() 進(jìn)行內(nèi)存映射,只需一次拷貝

  • 安全強(qiáng):每個 APP 分配UID(進(jìn)程的身份證號),同時支持實名(系統(tǒng)服務(wù))和匿名(自己創(chuàng)建的服務(wù))

可以讓自己的服務(wù)前往 ServiceManager 注冊,注冊后實名。

? Linux 傳統(tǒng)的 IPC 原理

了解 Linux IPC 相關(guān)的概念和原理有助于我們理解 Binder 通信原理。因此,在介紹 Binder 跨進(jìn)程通信原理之前,我們先聊聊 Linux 系統(tǒng)下傳統(tǒng)的進(jìn)程間通信是如何實現(xiàn)。

? 基本概念

Android圖文詳解Binder進(jìn)程通信底層原理是什么

由上圖看出:

  • 進(jìn)程隔離。

  • 進(jìn)程空間劃分:用戶空間(User Space)/內(nèi)核空間(Kernel Space)。

  • 系統(tǒng)調(diào)用:用戶態(tài)/內(nèi)核態(tài)。

? 進(jìn)程隔離

Android圖文詳解Binder進(jìn)程通信底層原理是什么

操作系統(tǒng)中,進(jìn)程與進(jìn)程間內(nèi)存是不共享的。SCC 進(jìn)程無法直接訪問 Service 進(jìn)程的數(shù)據(jù)。SCC 進(jìn)程和 Service 進(jìn)程之間要進(jìn)行數(shù)據(jù)交互就得采用進(jìn)程間通信(IPC)。

? 進(jìn)程空間劃分

現(xiàn)在操作系統(tǒng)都是采用的虛擬存儲器。操作系統(tǒng)的核心是內(nèi)核,獨立于普通的應(yīng)用程序,可以訪問受保護(hù)的內(nèi)存空間,也可以訪問底層硬件設(shè)備的權(quán)限。為了保護(hù)用戶進(jìn)程不能直接操作內(nèi)核,保證內(nèi)核的安全,操作系統(tǒng)從邏輯上將虛擬空間劃分為用戶空間(User Space)和內(nèi)核空間(Kernel Space)。

內(nèi)核空間(Kernel Space):是系統(tǒng)內(nèi)核運行的空間;

用戶空間(User Space):是用戶程序運行的空間。

所有內(nèi)核空間(虛擬地址)都映射在同一塊物理內(nèi)存,這樣就實現(xiàn)了內(nèi)存共享(所有進(jìn)程可通過IPC訪問)。

為了保證安全性,它們之間是隔離的。即使用戶程序蹦了,內(nèi)核也不受影響。

? 系統(tǒng)調(diào)用

進(jìn)程內(nèi) 用戶空間 & 內(nèi)核空間 進(jìn)行交互 需通過系統(tǒng)調(diào)用,主要通過函數(shù):

copy_from_user():將用戶空間的數(shù)據(jù)拷貝到內(nèi)核空間;

copy_to_user():將內(nèi)核空間的數(shù)據(jù)拷貝到用戶空間。

用戶態(tài):當(dāng)進(jìn)程在執(zhí)行用戶自己的代碼的時候,我們稱其處于用戶運行態(tài)(用戶態(tài));

內(nèi)核態(tài):當(dāng)一個進(jìn)程執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時,稱進(jìn)程處于內(nèi)核運行態(tài)(內(nèi)核態(tài))。

系統(tǒng)調(diào)用是用戶空間訪問內(nèi)核空間的唯一方式。

? 傳統(tǒng) IPC 通信原理

如圖,這就是 Sokcet的拷貝兩次。

Android圖文詳解Binder進(jìn)程通信底層原理是什么

當(dāng)然目前 Linux 已經(jīng)引入 Binder 通信機(jī)制。

? Binder IPC原理

上面整了一堆 Linux 下的 IPC 相關(guān)概念及原理,接下來我們正式介紹下 Binder IPC 的原理。

? Binder 采用分層架構(gòu)設(shè)計

Android圖文詳解Binder進(jìn)程通信底層原理是什么

  • 應(yīng)用層: 對于應(yīng)用通過調(diào)用startActivity()然后調(diào)用 AMP.startService , 經(jīng)過層層調(diào)用,最終必然會調(diào)用到AMS.startService。

  • Framework: 客戶類BinderProxy和服務(wù)類Binder(Binder通信是采用C/S架構(gòu), Android系統(tǒng)的基礎(chǔ)架構(gòu)便已設(shè)計好Binder在Java )。

  • Native層: 對于Native層,可以直接使用BpBinder和BBinder(當(dāng)然這里還有JavaBBinder)即可, 對于上一層Framework 的通信也是基于這個層面。

  • Kernel: 這里是Binder Driver, 前面3層都跑在用戶空間,對于用戶空間的內(nèi)存資源是不共享的,每個Android的進(jìn)程只能運行在自己進(jìn)程所擁有的虛擬地址空間, 而內(nèi)核空間卻是可共享的. 真正通信的核心環(huán)節(jié)還是在Binder Driver。

? Binder 驅(qū)動

Android圖文詳解Binder進(jìn)程通信底層原理是什么

在 Android 系統(tǒng)中,這個運行在內(nèi)核空間,負(fù)責(zé)各個用戶進(jìn)程通過 Binder 實現(xiàn)通信的內(nèi)核模塊就叫 Binder 驅(qū)動(Binder Dirver)。

? Binder IPC 內(nèi)存映射

Binder IPC 正是基于內(nèi)存映射(mmap)來實現(xiàn)的,一次完整的 Binder IPC 通信過程通常是這樣:

1、Binder 驅(qū)動在內(nèi)核空間創(chuàng)建一個數(shù)據(jù)接收緩存區(qū);

2、在內(nèi)核空間開辟一塊內(nèi)核緩存區(qū),

  • 建立內(nèi)核緩存區(qū)和內(nèi)核中數(shù)據(jù)接收緩存區(qū)之間的映射關(guān)系;

  • 內(nèi)核中數(shù)據(jù)接收緩存區(qū)和接收進(jìn)程用戶空間地址的映射關(guān)系;

3、發(fā)送數(shù)據(jù)完成了一次進(jìn)程間的通信。

  • 發(fā)送方進(jìn)程通過系統(tǒng)調(diào)用 copy_from_user() 將數(shù)據(jù) 拷貝 到內(nèi)核中的內(nèi)核緩存區(qū);

  • 由于內(nèi)核緩存區(qū)和數(shù)據(jù)接收緩存區(qū)存在內(nèi)存映射,因此也就相當(dāng)于把數(shù)據(jù)發(fā)送到了數(shù)據(jù)接收緩存區(qū);

  • 由于數(shù)據(jù)接收緩存區(qū)和進(jìn)程的用戶空間存在內(nèi)存映射因此也就相當(dāng)于把數(shù)據(jù)發(fā)送到了接收進(jìn)程的用戶空間。

內(nèi)存映射能減少數(shù)據(jù)拷貝次數(shù),實現(xiàn)用戶空間和內(nèi)核空間的高效互動。兩個空間各自的修改能直接反映在映射的內(nèi)存區(qū)域,從而被對方空間及時感知。也正因為如此,內(nèi)存映射能夠提供對進(jìn)程間通信的支持。

Android圖文詳解Binder進(jìn)程通信底層原理是什么

Binder傳值限制:

  • 原來的 BINDER_VM_SIZE:((1 * 1024 * 1024) - 4096 * 2)

  • 現(xiàn)在的BINDER_VM_SIZE:((1 * 1024 * 1024) - sysconf(_SC_PAGE_SIZE) * 2)

sysconf(_SC_PAGE_SIZE):這個函數(shù)用來獲取系統(tǒng)執(zhí)行的配置信息。例如頁大小、最大頁數(shù)、cpu個數(shù)、打開句柄的最大個數(shù)等等。

這個值表示你Binder最多傳這么多,超出就失敗。

? Android Binder 原理圖

? Bind 原理圖

Binder通信采用C/S架構(gòu),從組件視角來說,包含Client、Server、ServiceManager 以及 Binder 驅(qū)動,其中 ServiceManager 用于管理系統(tǒng)中的各種服務(wù)。

此處的ServiceManager是指Native層的ServiceManager(C++),并非指framework層的ServiceManager(Java) 原因:

所以,原理圖可表示為以下:

Android圖文詳解Binder進(jìn)程通信底層原理是什么

? Bind 原理圖交互

Client、Server、ServiceManager屬于進(jìn)程空間的用戶空間,不可進(jìn)行進(jìn)程間交互(下圖虛線表示)。

所以他們都通過與 Binder 驅(qū)動 進(jìn)行交互的,從而實現(xiàn)IPC通信方式。

所以,原理圖可表示為以下:

Android圖文詳解Binder進(jìn)程通信底層原理是什么

? Bind 原理圖交互路線

Android圖文詳解Binder進(jìn)程通信底層原理是什么

到這里 Binder 原理算是搞定了。不知道你懂了多少,有疑問可以聯(lián)系我,我們一起探討。下一篇咱們一起學(xué)習(xí) Binder 在 Android 中的具體實現(xiàn)。

“Android圖文詳解Binder進(jìn)程通信底層原理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI