首先,列下我学习的比较好的博客
- 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制
- Binder跨进程通信原理(三):Binder IPC实现原理
- android binder机制—Binder驱动
- Android10.0 Binder通信原理(五)-Binder驱动分析
简单总结下binder通信的流程,主要有 1)ServiceManager 启动 2)Service向ServiceManager 注册自己 3)Client向ServiceManager 查找Service 4)Client和Service 进行BInder通讯
1. ServiceManager 启动
参考 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制(如有侵权,请告知删除),其示意图如下
简单总结下上图:
service_manager 启动后,通过 binder_open 打开 /dev/binder 节点,在kernel驱动中会为该进程创建全局链表 binder_procs 和本进程对应的binder_proc ,然后将其插入binder_procs 。这个时候还不清楚service_manager 在binder通信中是什么角色,所以没有创建 binder_node 实体。- 通过
binder_become_context_manager 将service_manager 设备为binder 通信的守护进程,或者上下文,在kernel中创建binder_node 实体,其ref固定为0. - 开启loop,不断地处理其它service在
service_manager 对应的binder_proc的 todo 列表中插入的请求,主要有 addService ,findService ,然后返回处理结果。
内核对应过程的示意图:
2. Service向ServiceManager 注册自己
参考 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制(如有侵权,请告知删除),其示意图如下
内核对应过程的示意图:
注意:add_service时会创建三个对象
- 在service 对的应的binder_proc中创建binder_node,并插入rb nodes 红黑树
- 在serviceManager对应的binder_proc中创建 service的binder_ref节点,并插入ref_by_desc,ref_by_node两个代理树
- 尽管已经存在两个ref树了,但是查找通常是基于name 关键词。所以还会创建一个 name-handle 表
3. Client向ServiceManager 查找Service
查找服务的流程和注册服务的流程基本相似
注意:get_service会在client 对应binder_proc中的创建binder_ref并插入rb ref红黑数
4. Client和Service 进行BInder通讯
示意图如下(图片来源自android binder机制—Binder驱动,如有侵权,请告知删除):
|