面試問題
- Binder是什么
- 為什么要使用多進程
- 使用Binder進程通訊有哪些優(yōu)勢
- Binder是如何做到一次內(nèi)存拷貝的
- MMAP的原理講解
- Binder機制是如何跨進程的
- AIDL生成Java類的細節(jié)
- 四大組件底層的通訊機制
- 為什么Intent不能傳輸大數(shù)據(jù)
Binder是什么
Binder就是Android中的血管,在Android中我們所使用的Activity、Service等組件都需要和AMS(system_server)通信,這種跨進程通訊都是通過Binder完成的。
- 機制:Binder是一種進程間通訊機制。
- 驅(qū)動:Binder是一個虛擬物理設備驅(qū)動。
- 應用層:Binder是一個能發(fā)起通信的Java類。
為什么要使用多進程
虛擬機分配給各個進程的運行內(nèi)存是有限制的,LMK也會優(yōu)先回收對系統(tǒng)資源占用多的進程。
- 突破進程內(nèi)存限制:如圖庫占用資源過多。
- 功能穩(wěn)定性:獨立的通信進程保持長連接的穩(wěn)定性。
- 規(guī)避系統(tǒng)內(nèi)存泄漏:獨立的WebView進程,阻隔內(nèi)存泄漏導致的問題。
- 隔離風險:對于不穩(wěn)定的功能放到獨立進程,避免導致主進程崩潰。
- ......
我們可以可以觀察一些大廠的應用,都使用到了多進程。
使用Binder進程通訊有哪些優(yōu)勢
Linux進程通訊機制有哪些
共享內(nèi)存、Socket、消息隊列、管道。
Binder與傳統(tǒng)IPC對比
Binder | 共享內(nèi)存 | Socket | |
---|---|---|---|
性能 | 需要拷貝一次 | 無需拷貝 | 需要拷貝兩次 |
特點 | 基于C/S架構,易用性高 | 控制復雜,易用性低 | 基于C/S架構,作為一款通訊接口,其傳輸效率低,開銷大 |
安全性 | 為每個APP分配UID,同時支持實名和匿名 | 依賴上層協(xié)議,訪問接入點是開放的不安全 | 依賴上層協(xié)議,訪問接入點是開放的不安全 |
Binder是如何做到一次內(nèi)存拷貝的
內(nèi)存劃分
內(nèi)存被操作系統(tǒng)劃分為兩塊:用戶空間和內(nèi)核空間。用戶空間是用戶程序代碼運行的空間,內(nèi)核空間是內(nèi)核代碼運行的地方。為了安全,它們是隔離的,即使用戶的程序崩潰了,內(nèi)核也不會受到影響。
用戶空間映射到物理空間是不共享的,內(nèi)核空間映射到的物理空間是共享的。
傳統(tǒng)IPC機制從進程1的用戶空間拷貝到內(nèi)核空間,再從內(nèi)核空間拷貝進程2的用戶空間,進行了兩次拷貝。
Binder傳輸數(shù)據(jù)
Binder會在內(nèi)核空間和接收方(進程2的用戶空間)創(chuàng)建一個共享內(nèi)存,節(jié)約了一次拷貝。
MMAP的原理講解
MMAP
Linux通過將虛擬內(nèi)存區(qū)域與一個磁盤上的對象關聯(lián)起來,初始化這個虛擬內(nèi)存區(qū)域的內(nèi)容,這個過程被稱為內(nèi)存映射(memory mapping)。
對文件進行mmap,會在進程的虛擬內(nèi)存分配地址空間,創(chuàng)建映射關系。
實現(xiàn)這樣的映射關系之后,就可以采用指針的方式讀寫操作這一段內(nèi)存,而系統(tǒng)會自動回寫到對應的文件磁盤上。
MMAP的作用
將虛擬內(nèi)存映射到指定的物理內(nèi)存。
MMKV就使用到了MMAP。
Binder機制是如何跨進程的
數(shù)據(jù)發(fā)送方通過copy_from_user()把數(shù)據(jù)拷貝到內(nèi)核地址空間,內(nèi)核空間和接收方空間通過mmap()通過共享一塊物理內(nèi)存拿到數(shù)據(jù)。
AIDL生成Java類的細節(jié)
AIDL 自動生成java代碼——從分析內(nèi)部類Stub、Proxy入手
四大組件底層的通訊機制
四大組件底層的通訊機制使用的Binder。
bindService
-
客戶端進程與ServiceManager(系統(tǒng)服務)通信獲得AMS的IBinder。
- 客戶端通過AMS的IBinder與AMS通信,請求bindService。
-
AMS與服務進程通信執(zhí)行Service的onBind。
-
服務端進程與ServiceManager通信獲得AMS的IBinder。
- 服務端進程通過AMS的IBinder與AMS通信,發(fā)布自己的IBinder給AMS。
-
AMS與客戶端通信,轉(zhuǎn)發(fā)服務端的IBinder(代理BinderProxy)。
為什么Intent不能傳輸大數(shù)據(jù)
因為Intent啟動Activity使用到Binder,Binder傳輸數(shù)據(jù)是有大小限制的,限制大小是1M-8K。