Binder 之 oneway 機(jī)制

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_開頭;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容