Binder 是 Android 中的 IPC(進(jìn)程間通信)的最要一環(huán),它的作用就是:
- 異步調(diào)用
應(yīng)用向 binder 驅(qū)動(dòng)發(fā)送數(shù)據(jù)后不需要掛起線程等待 binder 驅(qū)動(dòng)的回復(fù),而是直接結(jié)束。 - 串行化處理
對(duì)于一個(gè)服務(wù)端的 AIDL 接口而言,所有的 oneway 方法不會(huì)同時(shí)執(zhí)行,binder 驅(qū)動(dòng)會(huì)將他們串行化處理,排隊(duì)一個(gè)一個(gè)調(diào)用。
像一些系統(tǒng)服務(wù)調(diào)用應(yīng)用進(jìn)程的時(shí)候就會(huì)使用 oneway,比如 AMS 調(diào)用應(yīng)用進(jìn)程啟動(dòng) Activity,這樣就算應(yīng)用進(jìn)程中做了耗時(shí)的任務(wù),也不會(huì)阻塞系統(tǒng)服務(wù)的運(yùn)行。
本篇不展開它是如何通信的,只聊聊它的機(jī)制,分兩種:
- oneway:調(diào)用方非阻塞(non-block)
- 非 oneway:調(diào)用方阻塞(休眠)
首先是非 oneway 的情況:

non-one-way.png
這里的掛起相當(dāng)于 Thread 的 sleep,是真正的"休眠",底層調(diào)用的是 waitEventInterruptible(), Linux 系統(tǒng)函數(shù)。
oneway 的情況,客戶端就不需要掛起線程等待:

one-way.png
寫在最后,涉及到的 binder 命令也有規(guī)律:
- 由外部發(fā)送給 binder 驅(qū)動(dòng)的都是 BC_ 開頭;
- 由 binder 驅(qū)動(dòng)發(fā)往外部的都是 BR_開頭;