Mojo是Chromium提供的用于进程间或进程内的模块间通信的一种机制,它屏蔽了通信时的类型转换。本文介绍了Mojo的一些基础概念,如何在工程中引入Mojo,并介绍了Mojo生成器以及相关知识。
关于如何在Blink使用Mojo可以看这篇文档。
开始我们的Mojo
想要在一个已经支持Mojo的应用(例如Chrome)使用它的话,最快捷的方式是查看使用的开发语言(C++,JavaScript或Java)对应的绑定文档(构建生成的代码(文档?)称为绑定-binding),也可以查看Mojom IDL与绑定生成器。
如果你需要关于创建/连接服务的文档,可以看Services documentation。
如果你需要查看如何将旧架构改造为新架构,可以查看将Chrome IPC改造为Mojo。
系统概述
Mojo是一个多个runtime库的合集,它提供了一个与平台无关的常用IPC语法,消息IDL格式,以及生成多种目标语言代码的绑定库,目的是便于跨进程及进程内边界间(指的是chromium侧,blink侧,第三方侧)的消息传递。
组成Mojo的不同的库对应不同的文档,功能的基本层级如下:
Mojo Core
为了使用高级库,例如System API或Bindings API,进程必须首先初始化Mojo Core。这是一次性操作,初始化后在进程的整个生命周期内都要保持其活动状态。初始化Mojo Core的两种方案:通过静态链接(Embedder API)或动态库链接。
静态链接(Embedding)
多数进程使用embedders方式连接Mojo,也就是说他们静态链接//mojo/core/embedder,每个进程内调用mojo::core::Init()初始化Mojo。文档Mojo Core Embedder API可以获取更多细节。
这样做的好处(静态链接)是可以确保使用Mojo的全部进程都使用了相同版本的Mojo Core。其他场景请使用动态链接。
动态链接(Dynamic Linking)
某些平台上,也可以使用动态链接Mojo Core库(libmojo_core.so或mojo_core.dll)的方式。
使用动态库,放置相关库的目录需要达到以下条件:应用的工作目录
环境变量MOJO_CORE_LIBRARY_PATH命名的目录
运行时应用显示命名的目录
跟静态链接时调用mojo::core::Init()不同,应用使用动态链接Mojo Core时需要调用C语言的MojoInitialize()。该调用找到并加载Mojo Core库以便后续Mojo API的使用。
注意,Mojo Core动态库是稳定的向前兼容的,该库支持所有当前的以及今后版本的higher-level public System和Bindings API。
C System API
一旦进程中的Mojo完成初始化,则在进程的整个生命周期内,该进程的任意线程都可以使用Mojo的C语言公共API。这是一个轻量级的API,小,稳定,向前兼容,是Mojo Core库的公共接口合集。
该API几乎不会直接调用,但是它是构建更高级别Mojo API的基础。它提供了消息管道,数据管道,共享buffer等创建及交互的Mojo API,以及进程间的引导连接API。
Platform Support API
Mojo为特定平台的IPC原语提供了一小部分抽象,目的是在两个进程间使用Mojo IPC。关于Platform API可以看这里。
High-Level System APIs
对于其支持的每种语言,都会有个一个较小的,高级别的系统API,基于低级C语言API构建。跟C语言API一样,相对于绑定API,系统API也很少被调用,不过有时还是需要且必要的。
C++
C++系统API提供了一层C++帮助类和函数,使安全系统API的使用更加容易:强类型句柄域,同步等待,系统句柄包装和解包的帮助类,常用句柄操作,以及更容易监控句柄状态变化的工具类。
JavaScript
JavaScript System API为JavaScript提供了Mojo原语,该原语覆盖全部Mojo基础功能的底层C语言API。
Java
Java System API提供了用来操作Mojo原语的帮助类,该原语覆盖全部Mojo基础功能的底层C语言API。
High-Level Bindings APIs
通常开发者定义接口而不是直接调用原始的消息管道I/O,这些接口用于生成指定开发语言的代码,该代码类似于常用的方法调用接口。这就是绑定层。
Mojom IDL and Bindings Generator
使用Mojom IDL定义接口,这个IDL会交给绑定生成器(bindings generator)用来生成不同开发语言的代码。生成的代码管理了接口客户端之间,实现之间传递的消息的编解码,简化了代码 - 隐藏消息管道 - 在所有接口连接侧。
C++ Bindings
目前为止,这是最常用的Mojo定义的API,C++ Bindings API提供了一组强大的功能,该功能用于通过生成的C++绑定代码与消息管道交互,还包括了支持相关绑定端点(bindings endpoints),相关接口,嵌套同步IPC(nested sync IPC),版本控制,错误日志报告,消息过滤器注入以及便利的测试套件。
JavaScript Bindings
JavaScript Bindings API提供了帮助类,该帮助类用于操作绑定生成器生成的JavaScript代码。
Java Bindings
Java Bindings API提供了帮助类,该帮助类用于操作绑定生成器生成的Java代码。