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

1 服务如何注册到 SM 中

\bullet getIServiceManager().addService(name, service, false);

  getIServiceManger --- new ServiceManagerProxy(new BinderProxy())

      BinderInternal.getContextObject --- 返回 BinderProxy 对象

        ProcessState::self()->getContextObject: 创建一个 BpBinder

        javaObjectForIBinder -->BinderProxy和BpBinder相互绑定

     ServiceManagerNative.asInterface

        返回 ServiceManagerProxy

\bullet addService 

    data.writeStrongBinder(service); --service == AMS --> 将 AMS放入data中

    mRemote.transact ---mRemote == BinderProxyxx

        获取 BpBinder  --- IPCThreaState::transact

          1. writeTransactionData ---out写入命令 --write  ----cmd = BC_TRANSACTION

          2. waitForResponse

              talkWithDriver --- 非常重要

                Binder_transaction

                  handle == 0 --> sm

                  1.target_node == sm

                  2.proc

                  3.保存todo,wait

                  4.创建t, tcomplete

                  5.数据拷贝

                  6.binder_transaction_binder --转换为--> handle

                  7.thread-->transaction_stack = t; ---> 方便sm找到client

                  8.t-->work.type =  BINDER_WORK_TRANSACTION; -- 给sm --> 做事

                  9.tcomplete-->type = BINDER_WORK_TRANSACTION_COMPLETE; --给client--挂起

                  10.wake_up_interruptible 唤醒sm

             client挂起

                  BR_NOOP, BR_TRANSACTION_COMPLETE

                  wait_event_freezable --- 挂起

              sm处理添加服务

                  BINDER_WORK_TRANSACTION ---要处理 cmd == BR_TRANSACTION

                          1. reply 初始化

                          2.res = func(bs, txn, &msg, &reply); --- 函数指针 --- svcmgr_handler 作用;获取或者添加service。sm 是用 svclist 保存所有服务的

                          3.binder_send_reply --- bc_reply

                          4.t-->work.type = BINDER_WORK_TRANSACTION; -- 给 client

                              tcomplete -->type = BINDER_WORK_TRANSACTION_COMPLETE; 给 SM --被挂起

                          5.wake_up_interruptible(target_wait); --- 唤醒 Client

              client 被唤醒

                  BINDER_WORK_TRANSACTION --- cmd = BR_REPLY;

              SM 处理 onTransact

                  IPCThreadState::executeCommand

                        error = reinterpret_cast<BBinder*>(tr.cookie)->transact(tr.code, buffer, &reply, tr.flags);

                        javaBBinder.ontransact --- C++

                        jboolean res = env -->CallBooleanMethod(mObject, gBinderOffsets.mExectransact,code, reinterpret_cast<jlong>(&data), reinterpret_cast<jlong>(reply), flags); -- BInder.java.execTransact方法

线程池管理:

1. 主线程 --- 不会退出,非主线程退出

2. 线程最大数 = 15 --- 非主线程

3. 主线程1个,不算在线程最大数中

4. 线程真正最大数 == 15 + 1 + 其它线程

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别偷我的猪_09

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

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

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

打赏作者

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

抵扣说明:

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

余额充值