架构

本文概述 Fuzio 的整体架构。

概述 

Fuzio 库的架构由多个进程组成,例如 Java 应用进程以及不同的 Chromium 进程:

Java ProcessKotlin/JavaAppChromium GPUFuzioBrowserViewComposeSwingSWTJavaFXEngineProfileBrowserFrameChromium MainEngineProfileBrowserChromium RendererFrameDOMJSFrameDOMJSDOMJSFrameDOMJSIPCChromium IPCChromiumIPCChromium IPCIPCIPC

以下章节将详细介绍各个进程、库的主要组件,以及整体工作原理。

进程 

Java 

这是一个标准的 Java 进程,你的 Java/Kotlin 应用程序在此运行。你可以在此使用 Fuzio API 来初始化 Engine、访问默认的 Profile、创建 Browser 实例、加载网页、访问 Frame的 DOM、执行 JavaScript,将 BrowserView 嵌入到你的 Java Swing、JavaFX 或 SWT 桌面应用程序中以显示加载网页的内容,等等。

Chromium 

Chromium 采用多进程架构(Multi-Process Architecture),会运行多个不同类型与用途的进程。下面介绍基本的进程类型。

Chromium 会自行决定需要启动多少个进程。它可能为内部功能、插件、扩展、工具等启动额外进程。

Main 

该进程由 Fuzio 在你创建 Engine 时启动。它是主管理进程,负责管理其他 Chromium 进程的生命周期。如果终止该进程,由其创建的所有 Chromium 子进程也会被终止。

每个 Engine 实例都会启动一个独立的 Chromium Main 进程。

渲染器 

在此进程中,运行着管理加载网页的 DOM 和 JavaScript 的 Frame 实例。当你将 Browser 导航到一个具有不同域的网页时,Chromium 引擎会启动此进程。

默认情况下,每个 Renderer(渲染器)进程都在沙盒中运行,因此无法直接访问您的磁盘、网络或显示设备。

GPU 

在此进程中,Chromium 使用 GPU 来渲染在不同 Chromium Renderer 进程中加载的网页内容。

进程间通信 

不同进程之间的通信通过进程间通信(IPC)进行。IPC 在本地计算机上的两个进程之间传输数据。

为了在 Java 和 Chromium 进程之间传输数据,Fuzio 使用其自己基于套接字和共享内存的 IPC 实现。Chromium 进程之间的通信则通过 Chromium IPC 实现完成。

主要组件 

Engine 

管理 Chromium 主进程的生命周期,并提供对核心 Chromium 功能的访问,允许管理配置文件、访问所有可用的媒体输入设备等。

请使用 Engine 类来操作引擎。它是库对象层次结构中的顶级对象。使用库从创建 Engine 实例开始。

有关创建和使用 Engine 实例的详细说明,请参阅 Engine 指南。

Profile 

表示一个 Chromium 配置文件。它允许将浏览器数据分开保存,例如历史记录、Cookie、缓存、代理设置、拼写检查器配置等。每个 Engine 都有一个默认 profile,在 Engine 初始化期间会自动创建。默认配置文件无法删除。

您可以使用 Profiles 服务创建新的配置文件,并在不需要时删除它们。

Profile 的历史记录、Cookie、缓存等文件存储在用户数据目录。如果您配置带有用户数据目录的 Engine 并创建一个 profile,该 profile 将存储在用户数据目录中,并在应用程序重启后恢复。

有关配置文件的更多信息,请阅读 Profile 指南。

Browser 

这是一个 Web 浏览器控件,负责加载网页或本地 HTML 文件、在加载的网页上查找文本、修改缩放比例、处理音频、获取加载进度通知、分发键盘和鼠标事件等。

请使用 Browser 类来操作该控件。每个 Browser 实例都属于一个 Profile。如果其 Profile 被删除或对应的 Engine 实例被关闭或崩溃,则 Browser 实例会自动关闭。

Browser 指南提供了有关如何创建和使用 Browser 的详细信息。

Frame 

每个加载到 Browser 的网页都有一个主 Frame,并可能包含多个子 frame。你可以使用 Frame 来访问和处理 DOM 以及 JavaScript。当网页被卸载时,其 Frame 及所有子 frame 会自动关闭。

工作原理 

创建 Engine 

当您创建 Engine 实例时,库会执行以下操作:

  1. 启动 Chromium MainGPU 进程。
  2. 在 Chromium 主进程中初始化 Chromium 引擎。
  3. 初始化默认 Profile。
  4. 在 Java 和 Chromium 主进程之间建立 IPC 连接。
run-engineJava AppEngineChromium MainEngineChromium GPUIPCChannelChromium IPC

如果你创建两个 Engine 实例,将为每个实例启动单独的 Chromium MainGPU 进程。例如:

run-enginesJava AppEngineEngineChromium MainEngineChromium GPUChromium MainEngineChromium GPUIPCChannelIPCChannelChromium IPCChromium IPC

创建 Browser 

当你创建 Browser 实例时,库会自动加载一个 about:blank 网页。这会导致创建 Chromium Renderer 进程,该网页的 DOM 和 JavaScript 在此进程中运行:

run-browserJava AppEngineProfileBrowserFrameabout:blankDOMJSChromium MainEngineProfileBrowserChromium RendererFrameabout:blankDOMJSChromium GPUIPCChannelIPCChannelChromium IPCChromium IPC

如果你将 Browser 导航到网页,该页面将在此 Chromium Renderer 进程中加载。如果之后加载不同域名的网页,将自动启动新的 Chromium Renderer 进程,并关闭之前页面对应的 Chromium Renderer 进程。

如果网页包含来自其他域名的 IFRAME,Chromium 会为该 remote frame 启动独立的 Renderer 进程。

关闭 Browser 

当关闭 Browser 实例时,对应的 Chromium Renderer 进程会自动终止。这意味着该进程中运行的所有 Frame 实例也会自动关闭:

run-engine-2Java AppEngineChromium MainEngineChromium GPUIPCChannelChromium IPC

关闭 Engine 

当关闭 Engine 时,库会执行以下操作:

  1. 关闭 Java 与 Chromium Main 进程之间的 IPC 连接。
  2. 在 Chromium Main 进程中释放 Chromium 引擎。
  3. 终止 Chromium Main 和 GPU 进程。
微信咨询

即库客服

微信公众号二维码

技术客服

微信公众号二维码