Android---进程间通信机制2

Service Manager(SM):大管家。管理系统服务的 Ibinder。

1 如何启动 service_manager 服务

SM注册:

1 binder_open(): 打开驱动(设置大小128K),内存映射

2 binder_become_context_manager(): 设置 SM 为大管家 --- sm  作用:为了管理系统服务

        1 创建 binder_node 结构体对象

        2 proc --指向--> binder_node

        3 创建 work 和 todo 队列 ---》 类似 messageQueue

3 binder_loop(): BC_ENTER_LOOPER 命令

        1 写入状态 Loop

        2 去读数据:binder_thread_read: ret = wait_event_freezable_exclusive(proc->wait, binder_has_proc_work(proc,thread)); 进入等待。

 

binder_become_context_manager(): 设置 SM 为大管家;binder_loop(): 循环监听 

binder_ioctl 里的 binder_ioctl_set_ctx_mgr() :创建 binder_node 结构体对象,把 proc 指向 binder_node ,创建 work 和 todo 队列

Binder_loop: binder_write()   binder_reade()  binder_thread_write()  binder_thread_read()

2 如何获取 service_manager服务

SM 获取:

需要获取 SM 的情况:1、注册服务到SM;  2、通过 SM 去获取服务--java

  1 ProcessState::self() -> getContextObject(NULL)

        1 ProcessState::self()

          1. 打开驱动:binder

          2. 设置线程最大数目:15个

          3. mmap --设置共享内存大小(1M - 8K) 普通服务的大小

        2 getContextObject

          1. 创建一个 BpBinder --相当于客户端对象

  2 interface_cast

        1 new BpServiceManager(new BpBinder)

        2 remote.transact --> 远程调用(跨进程)

        3 remote == BpBinder

 3 java 层 ---serviceManager.addService

        1 new ServiceManagerProxy(new BinderProxy)

        2 mRemote == BinderProxy

        3 BinderProxy.mObject == BpBinder

        4 mRemote.transact = BpBinder.transact (调用transact 就跨进程)

3 详解 AIDL 生成 Java 类

AIDL 帮我们处理 Binder 中繁琐、复杂的操作。

1、AsInterface:区分是在当前进程,还是跨进程。

2、proxy在调用时:1 打包;2 检测;3 跨进程(跨进程时,当前客户端线程要挂起 ---同步情况)。

3 stub(服务端):onTransact(),通过 code 参数进入第二个 case(下图圈出)里,执行 this.addPerson()方法,就能调用到服务端正真的方法。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别偷我的猪_09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值