標籤:android io 使用 資料 on cti ad 工作 ef
以下概述Binder通訊過程中涉及到的四個對象:Binder本機物件、Binder實體物件、Binder引用對象、Binder代理對象的生死。
1、Binder通訊的互動過程
1.Client 進程發出處理序間通訊請求,具體由Client進程中的代理對象通過Binder驅動程式向Server進程中的Binder本機物件發起請求。
2.Binder驅動程式根據Client進程傳遞過來的Binder代理對象的控制代碼值找到Binder驅動程式內的Binder引用對象。
3.根據Binder引用對象找到Binder實體物件。同時為本次請求建立一個binder_transaction結構(事務)來描述本次處理序間通訊過程。
4.Binder驅動程式根據找到的Binder實體物件找到運行在Server進程中的Binder本機物件,並將Client進程發來的資料發給他。
5.Server進程處理完成後,將處理結果返回給Binder驅動程式,驅動程式將結果寫入前面建立的binder_transaction中
6.Binder驅動程式通過儲存在binder_transaction中的Client資訊,找到Client進程,將通訊結果返回給對應的Binder代理對象處理。
2、由以上過程可知:binder代理對象依賴於binder引用對象,binder引用對象依賴於binder實體物件,binder實體物件依賴於binder本機物件。一下介紹這些被依賴的對象是如何保證粗活的:
binder 引用對象和binder實體物件在核心空間Binder驅動程式內部維護。實際上分別是binder_ref和binder_node結構體。
binder 代理對象在使用者空間Client進程內維護。是一個BpBinder對象。
binder 本機物件在使用者空間Server進程內維護。是一個BBinder對象。
1.Binder本機物件的生命週期。
在被驅動程式實體物件引用時,應該保證本機物件的引用計數不為0。在Server進程將一個Binder本機物件註冊到ServerManager時,Binder驅動程式會為他建立對應的實體物件(binder_node)。當有Cient進程查詢Binder本機物件的代理對象介面時,binder_node 中的有關引用計數的值會發生改變。Binder驅動通過函數:
binder_thread_read
使用協議BR_INCREFS,BR_ACQUIRE,BR_DECREFS,BR_RELEASE與Server進程通訊。通訊資料會寫入Server進程的一個使用者空間緩衝區中。
Server進程的IPCThreadState的成員函數executeCommand從取出協議命令並執行,增減本機物件的強弱引用計數實現生命週期管理。
另:BBinder繼承自RefBase,在使用者空間的引用可自動管理。
2.Binder實體物件的生命週期。
當Binder引用對象建立或銷毀時,由於引用對象會引用實體物件,需要對應的增減Binder實體物件的引用計數。因為同在核心空間,調用binder_inc_node和binder_dec_node操作實體物件的引用,具體規則參考源碼binder.c的這兩個函數實現。
3.Binder引用對象的生命週期。
類似本機物件的生命週期,在Binder驅動程式內使用函數binder_thread_write,讀取由Client寫入使用者空間緩衝區的BC_ACQUIRE,BC_INCREFS,BC_RELEASE,BC_DECREFS四個協議增減Binder引用對象的強弱引用計數。
這個過程是通過Client進程傳進來的控制代碼值找到對應的引用對象的。
4.Binder代理對象的生命週期。
3.Binder對象死亡通知機制:
過程一:
1.定義死亡接收通知,DeathRecipient
2.調用代理對象BpBinder的linkToDeath註冊。註冊的最後會調用IPCThreadState::flushCommands()將註冊死亡通知協議儘快通知給Binder驅動程式
3.Binder驅動程式在binder_thread_write中處理註冊請求。
過程二:
1.發送死亡通知:本機物件死亡會出發關閉/dev/binder裝置,binder_release會被調用,binder驅動程式會在其中檢查Binder本機物件是否死亡,該過程會調用binder_deferred_release 執行。如死亡會在binder_thread_read中檢測到BINDER_WORK_DEAD_BINDER的工作項目。就會發出死亡通知。
2.接收死亡通知:Client進程會在IPCThreadState::executeCommand函數中處理到BR_DEAD_BINDER協議了。
過程三:
1.登出接收死亡通知:代理對象調用BpBinder::unlinkToDeath。
android binder 處理序間通訊機制3-Binder 對象生死