当前位置: 首页 > java >正文

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

IRemoteTransfer是一个AIDL接口,RemoteTransfer是它的实现类,RemoteTransfer还实现了IRemoteServiceTransfer接口。

这里需要一张类图来帮你理清思路:

#IRemoteTransfer.aidl

interface IRemoteTransfer {

//① 将Dispatcher代理返回给RemoteTransfer

oneway void registerDispatcher(IBinder dispatcherBinder);

oneway void unregisterRemoteService(String serviceCanonicalName);

oneway void notify(in Event event);

}

#IRemoteServiceTransfer.java

public interface IRemoteServiceTransfer {

//②获取远程服务包装

BinderBean getRemoteServiceBean(String serviceCanonicalName);

//注册/反注册 远程服务

void registerStubService(String serviceCanonicalName, IBinder stubBinder);

void unregisterStubService(String serviceCanonicalName);

}

两个问题需要注意:

① 方法的调用方在Dispatcher中,这样就把Dispatcher的远程代理回传给了当前进程,之后注册远程服务就可以通过这个DispatcherProxy完成。

② 无论是注册还是获取远程服务,都是不能直接传递Binder的,因为Binder并没有实现Parcelable接口,因此需要将Binder包装在一个实现了Parcelable接口的类中传递,BinderBean就是其中一个包装类。

主体逻辑已经讲清楚了,我们正式开始分析功能。

  • 通过ContentProvider方式同步的获取Dispatcher的代理,这个ContentProvider属于Dispatcher进程,且通过插桩的方式织入manifeset文件。

  • 获取远程服务时传递当前进程的Activity或Fragment,并bind预先插桩好的StubService,这个StubService属于远程服务所在进程。

这是整个Andromeda工程最最核心的原理,你是不是快看不懂了,没关系,下面会结合时序图、关系图详细分析实现过程。

本地服务

本地服务没什么讲的,内部通过维护一个Map关系表,来记录注册服务的名称和实现类。

LocalServiceHub

public class LocalServiceHub implements ILocalServiceHub {

private Map<String, Object> serviceMap = new ConcurrentHashMap<>();

@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&#x
http://www.xdnf.cn/news/11339.html

相关文章:

  • innerText,innerHTML的用法以及注意事项
  • Linux 内核(Kernel)组成分析
  • 建议收藏万字长文!嵌入式Linux系统移植原理与方法总结
  • 码率(Bitrate)、帧率(FPS)、分辨率和清晰度的联系与区别
  • srcollTop、clientHeight、scrollHeight详解
  • 【linux3.10】从mmap的实现来看vma的组织和使用
  • 解决mfc100u.dll丢失
  • ffmpeg和H264视频的编解码
  • 灰度、灰度级、分辨率、像素值;
  • 详细说明如何实现简易轮播效果
  • 电脑技巧:进程管理工具Process Explorer介绍
  • 聚水潭ERP集成用友NC(聚水潭主供应链)
  • U盘启动盘怎么制作?
  • 程序员必备的15个接单平台,拥有即将获得“钞能力”!
  • 芯片架构设计及其作用
  • 【C语言】C语言 学生成绩管理系统(源码+报告)【千行代码】【独一无二】
  • CLOSE_WAIT状态的原因与解决方法
  • 一文彻底搞懂进程间通信方式
  • 网关(Gateway)
  • Win10系统搭建个人hMailServer邮件服务结合内网穿透远程发邮件
  • XSD(Xml Schema Definition)详解
  • 文菌装NAS E5:超详细!手把手教您安装黑群晖918+6.2保姆级教程
  • 生态增长 TVL 飙升,Metis 或是 Layer2 最具潜力黑马
  • 编译原理-10-SDT
  • 深度强化学习及其在军事领域中的应用综述
  • 需求管理的主要内容包括哪些
  • 如何配置JDK
  • 2024年最全AutoRuns下载安装使用教程(图文教程)超详细,成功入职阿里
  • 2024年运维最新Linux系统的web管理工具——webmin搭建,2024年最新蚂蚁金服内推四面
  • 深入理解计算机系统(CSAPP)含lab详解 完结