Android组件化跨进程通信框架Andromeda解析

@Override

public Object getLocalService(String module) {

return serviceMap.get(module);

}

@Override

public void registerService(String module, Object serviceImpl) {

serviceMap.put(module, serviceImpl);

}

@Override

public void unregisterService(String module) {

serviceMap.remove(module);

}

}

远程服务

远程服务是框架的核心,对远程服务的操作就是两个,一是注册远程服务,二是获取远程服务。

我们先来看服务的注册,时序图如下 ↓

  1. 客户端通过<T extends IBinder> registerRemoteService(String serviceCanonicalName, T stubBinder)注册本进程可提供的远程服务,stubBinder即服务实现类。

  2. 调用RemoteTransfer的registerStubService方法。

  3. registerStubService内部先初始化DispatcherProxy,如果为空跳转3.1。

  • 3.1-3.2 要实现服务的同步注册,本质上是同步获取DispatcherProxy,这是一次IPC通信,Andromeda的方案是在Dispatcher进程插桩一个ContentProvider,然后返回一个包含DispatcherProxy的Cursor给客户端进程,客户端解析Cursor拿到DispatcherProxy。
  1. RemoteTransfer请求RemoteServiceTransfer帮忙完成真正的注册。

  2. RemoteServiceTransfer通过第3步获取的DispatcherProxy,做一次IPC通信,将Binder传递到Dispatcher进程。

  3. Dispatcher进程请求ServiceDispatcher类帮忙完成服务的注册,其实就是将Binder存储在一个Map当中。

图中蓝色的节点表示注册服务的当前进程,也就是Server进程,红色节点表示Dispatcher进程。

整个过程重点在第三步,我们再重点分析一下:

RemoteTransfer

private void initDispatchProxyLocked() {

if (null == dispatcherProxy) {

//从contentprovider取Binder

IBinder dispatcherBinder = getIBinderFromProvider();

if (null != dispatcherBinder) {

//取出后asInterface创建远程代理对象

dispatcherProxy = IDispatcher.Stub.asInterface(dispatcherBinder);

registerCurrentTransfer();

}

}

}

private void registerCurrentTransfer() {

//向Dispatcher注册自己这个进程的RemoteTransfer Binder

dispatcherProxy.registerRemoteTransfer(android.os.Process.myPid(), this.asBinder());

}

private IBinder getIBinderFromProvider() {

Cursor cursor = null;

try {

//通过contentprovider拿到cursor

cursor = context.getContentResolver().query(getDispatcherProviderUri(), DispatcherProvider.PROJECTION_MAIN,

null, null, null);

if (cursor == null)

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值