实用程序进程

警告

截至 2022 年 1 月,此进程正在进行大量开发,许多内容可能会发生变化。文档可能并不总是像预期的那样准确。如果您打算添加新的实用程序,请咨询 #ipc 频道。

实用程序进程用于提供一种简单的方法来实现 IPC 参与者,并具有一些更具体的沙盒属性,在您不需要或不希望处理添加全新进程类型带来的额外复杂性,但只需要应用不同的沙盒策略的情况下。要实现这样的参与者,您需要遵循与实现 EmptyUtil 中可见的简单示例类似的一些步骤。

  • 定义一个新的 IPC 参与者,例如 PEmptyUtil,它允许子进程通过 GetSomeString() 将一些字符串传递给父进程。

  • PUtilityProcess 定义中,公开一个新的子级方法,例如 StartEmptyUtilService(Endpoint<PEmptyUtilChild>)

  • 实现 EmptyUtilChildEmptyUtilParent 类,这两个类都派生自它们的 PEmptyUtilXX。如果您希望或需要从不同的线程运行内容,可以查看 UtilityProcessGenericActor

  • 确保两者都被引用计数。

  • UtilityProcessManager 上公开您的新服务,并使用一个执行启动进程的繁重操作的方法,您可以从示例中的 StartEmptyUtil() 获取灵感。

  • 理想情况下,此启动方法应依赖于 StartUtility()

  • 要使用上面提到的 StartUtility(),请确保您提供了一个 nsresult BindToUtilityProcess(RefPtr<UtilityProcessParent> aUtilityParent)。通常,它应该负责创建一组端点并执行 Bind() 以设置 IPC。您可以查看 Utility AudioDecoder 的一些示例。

  • 为了在 about:processes 中正确显示面向用户的展示,您还需要通过方法 UtilityActorName GetActorName() { return UtilityActorName::EmptyUtil; } 提供参与者名称。

  • UtilityProcess 的子端内部处理 StartEmptyUtilService 的接收,在 RecvStartEmptyUtilService() 中。

  • UtilityProcessChild::ActorDestroy 中,释放您在 RecvStartEmptyUtilService() 中存储的任何资源的引用。这可能包括对 EmptyUtilChild 的引用。

  • 特定的沙盒要求可以通过跟踪 SandboxingKind 来实现,它从 UtilityProcessSandboxing 头文件 开始。

  • 尝试并确保您至少添加了一些新参与者的 gtest 覆盖范围,例如 现有的 gtest 中所示。

  • 还应确保在以下位置进行实际的沙盒测试: