binder結構
當我們使用aidl進行跨程序呼叫時,我們需要在兩端各建立aidl檔案,此時系統會幫我們在generated/source/aidl/debug/包名/下建立兩個一樣的binder檔案,這個檔案分為**結構,即描述遠端呼叫方法的介面-客戶端轉換binder物件以及服務端處理請求的stub類-客戶端填入引數發起遠端呼叫的proxy類。
最上層是乙個我們在aidl中宣告了的介面(描述我們需要呼叫的方法的介面),此介面繼承iinte***ce(注意是繼承)介面,含有三部分內容,第一部分是stub類,第二部分是標識客戶端想呼叫的不同方法的整型id,第三部分是目標呼叫方法的簽名。
stub內部類繼承binder類,實現了上面的介面(即父介面),含有兩個主要方法,乙個是asinte***ce方法,此方法用於轉換服務端的aidl介面物件,若為同程序呼叫,返回服務端stub物件本身,否則返回系統封裝後持有服務端binder引用的proxy物件;另乙個是ontransact方法,這個方法被分配處理遠端請求,通過code分辨所呼叫方法,然後從data中取出引數執行目標方法,寫入返回值。若返回false則遠端呼叫請求失敗。
proxy類同樣實現了上面的一級介面,此類含有兩部分,第一部分為asbinder方法,返回當前的遠端binder物件引用,第二部分為aidl中定義的遠端方法的同名方法(或不止乙個),作用為建立遠端方法所需要的進出引數寫入data,然後呼叫transact方法發起rpc遠端過程呼叫請求,然後掛起,當rpc過程返回後取出並返回處理結果。
呼叫過程
經由以上,binder呼叫的實際過程為服務端通過binder向servicemanager註冊,client向servicemanager查詢目標服務,發出呼叫請求,binder驅動返回乙個遠端引用(遠端呼叫時),客戶端呼叫同名方法並掛起,binder驅動通知服務端呼叫相應方法,binder驅動返回結果。binder本身也是種服務,占用了binder驅動中的0號引用。
Binder系列10 總結
從android driver層 binder還可以理解為一種虛擬的物理裝置,它的裝置驅動是 dev binder 從android native層 binder是建立service manager以及bpbinder bbinder模型,搭建與binder驅動的橋梁 從android framew...
簡單理解 Binder 呼叫流程
從大年初一購買電影票說起 客戶端 獲取服務端在 binder 驅動中對應的引用,然後呼叫它的 transact 方法,向服務端傳送訊息 客戶端程序 服務端 該物件被建立後,內部則會啟動乙個隱藏執行緒,不斷的接收從客戶端傳送過來的資料,然後執行 binder 物件中的 ontransact 函式 bi...
簡單cursor 備忘
declare id nvarchar 20 定義變數來儲存id號 declare date datetime declare dfd nvarchar 200 定義變數來儲存值 set dfd declare mycursor cursor for select mid,createddate f...