架构
这是 JxBrowser 架构的概述。
概述
JxBrowser 库的架构由多个进程组成,如 Java 应用程序进程和不同的 Chromium 进程:
以下部分将详细介绍每个进程、库的主要组件,并描述它们的工作原理。
进程
Java
这是运行 Java 应用程序的标准 Java 进程。在这里,您可以使用 JxBrowser API 来初始化 Engine
,访问默认 Profile
,创建 Browser
实例,加载网页,访问 Frame
的 DOM,执行 JavaScript,将 BrowserView
嵌入到 Java Swing、JavaFX 或 SWT 桌面应用程序中,以显示加载的网页内容等等。
Chromium
Chromium 使用 Multi-Process Architecture 并运行多个进程。每个进程都有自己的类型和目的。您可以在下面找到基本进程类型的说明。
Chromium 决定应该启动多少进程。它可能会为其内部功能、插件、扩展、实用程序等运行额外的进程。
Main
这个进程是在你创建 Engine
的时候由 JxBrowser 启动的。它是管理其他 Chromium 进程生命周期的主进程。如果您终止此进程,则此进程产生的所有其他 Chromium 进程也将终止。
对于每个 Engine
实例,都会启动一个单独的 Chromium Main 进程。
Renderer
在此进程中,管理加载网页的 DOM 和 JavaScript 的 Frame
实例正在运行。当您将 Browser
导航到具有不同域的网页时,Chromium 引擎会启动这个进程。
默认情况下,每个 Renderer 进程都在沙盒中运行,因此它不能直接使用您的磁盘、网络或显示器。
GPU
在此进程中,Chromium 使用 GPU 渲染不同 Chromium Renderer 进程中加载的网页内容。
进程间通信
不同进程之间的通信是通过进程间通信(IPC)完成的。IPC 在本地机器上的两个进程之间传输数据。
为了在 Java 和 Chromium 进程之间传输数据,JxBrowser 使用自己的基于套接字和共享内存的 IPC 实现。Chromium 进程之间的通信是通过 Chromium IPC 实现完成的。
主要组成部分
Engine
管理 Chromium Main 进程的生命周期,并提供对核心 Chromium 功能的访问权限,允许管理配置文件、访问所有可用的媒体输入设备等。
要使用引擎,请使用 Engine
类。它是库对象层次结构中的顶级对象。使用库从创建 Engine
实例开始。
有关 Engine
实例的创建和使用的详细说明,请参阅 Engine 指南。
Profile
代表一个 Chromium 配置文件。它允许将所有浏览器数据分开保存,如历史记录、cookies、缓存、代理设置、拼写检查器配置等。每个 Engine
都有一个在 Engine
初始化期间自动创建的默认配置文件。默认配置文件无法删除。
您可以使用 Profiles
服务创建新的配置文件并在不需要时将其删除。
配置文件的历史记录、cookies、缓存等文件存储在用户数据目录中。如果您使用用户数据目录配置 Engine
并创建配置文件,这个配置文件将存储在用户数据目录中,并在应用程序重启后恢复。
关于配置文件的更多信息,请参阅 Profile 指南。
Browser
这是一个网页浏览器控件,负责加载网页或本地 HTML 文件、在加载的网页上查找文本、修改缩放比例、处理音频、获取有关加载进度的通知、调度键盘和鼠标事件等等。
要使用此控件,请使用 Browser
类。每个 Browser
实例都属于 Profile
。如果 Profile
被删除或其 Engine
实例关闭或崩溃,Browser
实例将被自动关闭。
Browser 指南中详细介绍了如何创建和使用 Browser
。
Frame
Browser
中加载的每个网页都有一个主 Frame
。该 Frame
本身可能有子框架。您可以使用 Frame
访问和操作 DOM 与 JavaScript。当网页被卸载时,它的 Frame
和所有子框架都会自动关闭。
工作原理
创建 Engine
当您创建一个 Engine
实例时,该库会执行以下操作。
- 启动 Chromium Main 和 GPU 进程。
- 在 Chromium Main 进程中初始化 Chromium 引擎。
- 初始化默认配置文件。
- 在 Java 和 Chromium Main 进程之间设置 IPC 连接。
如果您创建两个 Engine
实例,则将为每个实例启动单独的 Chromium Main 和 GPU 进程。例如:
创建 Browser
当您创建 Browser
实例时,该库会自动加载一个 about:blank
网页。它会引导 Chromium Renderer 进程的创建,该进程负责运行此网页的 DOM 和 JavaScript 代码:
如果您将 Browser
实例导航到网页,该页面将在此 Chromium Renderer 进程中加载。如果您随后加载具有不同域的网页,它将加载到一个新的 Chromium Renderer 进程中,该进程将自动启动。而之前为网页创建的 Chromium Renderer 进程将被关闭。
如果一个网页包含了一个来自另一个域的 IFRAME
,Chromium 将会为这个 remote frame 运行一个单独的渲染器进程。
关闭 Browser
当您关闭 Browser
实例时,相应的 Chromium Renderer 进程会自动终止。这意味着在终止进程中运行的所有 Frame
实例也将自动关闭:
关闭 Engine
当您关闭 Engine
时,库会执行以下操作:
- 关闭 Java 和 Chromium Main 进程之间的 IPC 连接。
- 在 Chromium Main 进程中配置 Chromium 引擎。
- 终止 Chromium Main 进程 和 GPU 进程。