【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse )
文章目錄
- 前言
- 一、binder_loop 方法調用
- 二、binder_loop 方法參數 svcmgr_handler
- 三、binder_loop 方法
- 四、binder_parse 方法
前言
在上一篇博客 【Binder 機制】Native 層 Binder 機制分析 ( service_manager.c | 開啟 Binder | 注冊 Binder 進程上下文 | 開啟 Binder 循環 ) 中分析了 Binder Native 實現中的 service_manager.c 中的 main 函數的啟動過程 ;
- 開啟 Binder : bs = binder_open(driver, 128*1024);
- 將自己注冊成 Binder 進程的上下文 : binder_become_context_manager(bs)
- 開啟 Binder 循環 : binder_loop(bs, svcmgr_handler);
一、binder_loop 方法調用
在 service_manager.c 中的 main 函數中 , 執行了 binder_loop 方法 , 傳入了 svcmgr_handler 方法名作為回調函數 ;
int main(int argc, char** argv) {binder_loop(bs, svcmgr_handler);return 0; }完整代碼參考 /frameworks/native/cmds/servicemanager/service_manager.c
二、binder_loop 方法參數 svcmgr_handler
svcmgr_handler 方法定義在 service_manager.c 中 ; svcmgr_handler 方法名是 Service Manager Handler 的簡寫 ;
struct binder_io *msg 是傳入的消息 ;
struct binder_io *reply 參數是返回參數 ;
svcinfo 結構體是一個鏈表 ;
傳入不同的消息執行不同的處理 :
- SVC_MGR_ADD_SERVICE : 收到消息 , 添加一個 Binder 服務 ;
- SVC_MGR_CHECK_SERVICE : 收到消息 , 找到一個 Binder 服務 ;
完整代碼參考 /frameworks/native/cmds/servicemanager/service_manager.c
三、binder_loop 方法
在開啟 Binder 循環的 binder_loop 方法中 , 如果收到 Binder 讀寫消息信息 , 調用 binder_parse 方法處理 , 調用代碼如下 :
res = binder_parse(bs, 0, (uintptr_t) readbuf, bwr.read_consumed, func);binder_loop 方法代碼如下 :
void binder_loop(struct binder_state *bs, binder_handler func) {int res;struct binder_write_read bwr;uint32_t readbuf[32];bwr.write_size = 0;bwr.write_consumed = 0;bwr.write_buffer = 0;readbuf[0] = BC_ENTER_LOOPER;// binder_write(bs, readbuf, sizeof(uint32_t));// 開啟無限循環 for (;;) {bwr.read_size = sizeof(readbuf);bwr.read_consumed = 0;bwr.read_buffer = (uintptr_t) readbuf;res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);if (res < 0) {ALOGE("binder_loop: ioctl failed (%s)\n", strerror(errno));break;}// 如果收到 Binder 讀寫消息信息 , 調用 binder_parse 方法處理 ;res = binder_parse(bs, 0, (uintptr_t) readbuf, bwr.read_consumed, func);if (res == 0) {ALOGE("binder_loop: unexpected reply?!\n");break;}if (res < 0) {ALOGE("binder_loop: io error %d %s\n", res, strerror(errno));break;}} }完整代碼參考 /frameworks/native/cmds/servicemanager/binder.c
四、binder_parse 方法
binder_parse 方法中接收的 binder_handler func 參數是一個回調方法 ; 該方法是 Binder 服務收到了客戶端請求后的回調函數 ;
int binder_parse(struct binder_state *bs, struct binder_io *bio,uintptr_t ptr, size_t size, binder_handler func) {int r = 1;uintptr_t end = ptr + (uintptr_t) size;while (ptr < end) {uint32_t cmd = *(uint32_t *) ptr;ptr += sizeof(uint32_t); #if TRACEfprintf(stderr,"%s:\n", cmd_name(cmd)); #endif// 根據不同指令 , 執行不同操作 ; switch(cmd) {case BR_NOOP:break;case BR_TRANSACTION_COMPLETE:break;case BR_INCREFS:case BR_ACQUIRE:case BR_RELEASE:case BR_DECREFS: #if TRACEfprintf(stderr," %p, %p\n", (void *)ptr, (void *)(ptr + sizeof(void *))); #endifptr += sizeof(struct binder_ptr_cookie);break;case BR_TRANSACTION: {struct binder_transaction_data *txn = (struct binder_transaction_data *) ptr;if ((end - ptr) < sizeof(*txn)) {ALOGE("parse: txn too small!\n");return -1;}binder_dump_txn(txn);if (func) {unsigned rdata[256/4];struct binder_io msg;struct binder_io reply;int res;bio_init(&reply, rdata, sizeof(rdata), 4);bio_init_from_txn(&msg, txn);// 執行回調方法 res = func(bs, txn, &msg, &reply);if (txn->flags & TF_ONE_WAY) {binder_free_buffer(bs, txn->data.ptr.buffer);} else {binder_send_reply(bs, &reply, txn->data.ptr.buffer, res);}}ptr += sizeof(*txn);break;}case BR_REPLY: {struct binder_transaction_data *txn = (struct binder_transaction_data *) ptr;if ((end - ptr) < sizeof(*txn)) {ALOGE("parse: reply too small!\n");return -1;}binder_dump_txn(txn);if (bio) {bio_init_from_txn(bio, txn);bio = 0;} else {/* todo FREE BUFFER */}ptr += sizeof(*txn);r = 0;break;}case BR_DEAD_BINDER: {struct binder_death *death = (struct binder_death *)(uintptr_t) *(binder_uintptr_t *)ptr;ptr += sizeof(binder_uintptr_t);death->func(bs, death->ptr);break;}case BR_FAILED_REPLY:r = -1;break;case BR_DEAD_REPLY:r = -1;break;default:ALOGE("parse: OOPS %d\n", cmd);return -1;}}return r; }總結
以上是生活随笔為你收集整理的【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Binder 机制】Native 层
- 下一篇: 【设计模式】面向对象 - 多态 ( 面向