public void registerService(String module, Object serviceImpl) {
serviceMap.put(module, serviceImpl);
}
@Override
public void unregisterService(String module) {
serviceMap.remove(module);
}
}
远程服务
远程服务是框架的核心,对远程服务的操作就是两个,一是注册远程服务,二是获取远程服务。
我们先来看服务的注册,时序图如下 ↓
-
客户端通过
<T extends IBinder> registerRemoteService(String serviceCanonicalName, T stubBinder)
注册本进程可提供的远程服务,stubBinder即服务实现类。 -
调用RemoteTransfer的registerStubService方法。
-
registerStubService内部先初始化DispatcherProxy,如果为空跳转3.1。
- 3.1-3.2 要实现服务的同步注册,本质上是同步获取DispatcherProxy,这是一次IPC通信,Andromeda的方案是在Dispatcher进程插桩一个ContentProvider,然后返回一个包含DispatcherProxy的Cursor给客户端进程,客户端解析Cursor拿到DispatcherProxy。
-
RemoteTransfer请求RemoteServiceTransfer帮忙完成真正的注册。
-
RemoteServiceTransfer通过第3步获取的DispatcherProxy,做一次IPC通信,将Binder传递到Dispatcher进程。
-
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() {