首页
/ Ladybird 浏览器技术解析:独立引擎、多进程架构与构建实战

Ladybird 浏览器技术解析:独立引擎、多进程架构与构建实战

2026-09-05 14:44:36作者:牧宁李

Ladybird 是一款自称"真正独立"的 Web 浏览器,本文基于仓库根目录的 README 展开,结合仓库中的构建文档、进程架构文档与源码目录结构,系统讲解它的多进程架构设计、核心库栈组成,以及从零构建并运行浏览器的完整流程。读完本文,你将理解 Ladybird 如何在进程隔离上保障对恶意 Web 内容的鲁棒性,并能独立完成 Meta/ladybird.py 的构建、运行与常见配置项调整。

Ladybird 是什么:一个处于 pre-alpha 阶段的独立浏览器

Ladybird 的定位是一个"真正独立的 Web 浏览器",其引擎基于 Web 标准从头构建,而非对既有引擎(如 WebKit 或 Blink)的衍生。README 中特别标注:Ladybird 目前处于 pre-alpha 状态,仅适合开发者使用。这意味着它更像一个引擎与浏览器架构的持续工程实验,而不是面向终端用户的成品软件——在引用或试用时应以此前提为限。

仓库的顶层目录也印证了它的技术形态:Libraries/ 存放核心库(Web 引擎、JS 引擎、网络、图形等),Services/ 存放独立进程,UI/ 存放各平台前端,Tests/ 存放测试,Meta/ 存放构建工具链。整个工程采用 C++23 为主语言,同时引入 Rust 工具链(根目录含 Cargo.tomlrust-toolchain.toml),构建系统基于 CMake + Ninja + vcpkg(根目录 vcpkg.json)。

多进程架构:面向任意(且可能敌对)的 Web 内容

README 中"Features"一节指出,Ladybird 的目标是构建一个完整的、可用于现代 Web 的浏览器,其架构要点是:

  • 采用多进程架构:一个主 UI 进程、若干 WebContent 渲染进程、一个 ImageDecoder 进程、一个 RequestServer 进程;
  • 图像解码与网络连接全部在进程外完成,以增强对恶意内容的鲁棒性;
  • 每个标签页拥有独立的渲染进程,且该进程被沙箱化,与系统其余部分隔离。

Ladybird 浏览器技术解析:独立引擎、多进程架构与构建实战

进程架构文档 对这一模型做了更细的说明(文档自身声明"部分描述仍是愿景,实现仍在推进中",引用时需注意这一保留):

进程 职责 对应源码目录
Browser(UI 进程) GUI 主程序,管理标签页;内部通过 OutOfProcessWebView 组件负责派生各辅助进程 UI/
WebContent 承载主 HTML/CSS 引擎(LibWeb)并运行 JavaScript(LibJS);接收输入事件、将内容绘制到共享位图;对外通信只能经由 RequestServer Services/WebContent
RequestServer 使用 HTTP/HTTPS 等网络协议对外发起请求;每个 WebContent 进程按需派生自己的 RequestServer 代为上传/下载 Services/RequestServer
ImageDecoder 将 PNG、JPEG、BMP、ICO、PBM 等图片解码为位图;每张图在新的 ImageDecoder 进程中解码,沙箱极强 Services/ImageDecoder

从源码结构看,Services/CMakeLists.txt 中注册的服务比 README 列举的更多:Compositor(合成器)、WasmCompiler(WebAssembly 编译服务,在启用 ENABLE_CRANELIFT_JIT 时构建)、WebDriver(自动化驱动)与 WebWorker(Web Worker 宿主)。也就是说,仓库实际实现的进程面比 README 的概述更进一步。

关于沙箱,架构文档描述了基于 pledge()unveil() 的激进的沙箱机制,且除 Browser 外所有进程以非特权用户运行;仓库中同样存在 Services/RendererSandboxLinux.cppServices/RendererSandboxMacOS.cpp 等按平台实现的渲染进程沙箱代码,可以推断渲染进程沙箱已按平台分别落地。

核心库栈:从 SerenityOS 继承的支撑组件

README 明确列出,目前许多核心库支撑组件继承自 SerenityOS。对照 Libraries/ 目录,各组件与源码一一对应:

组件 作用 源码位置
LibWeb Web 渲染引擎(HTML/CSS/DOM) Libraries/LibWeb
LibJS JavaScript 引擎 Libraries/LibJS
LibWasm WebAssembly 实现 Libraries/LibWasm
LibCrypto / LibTLS 密码学原语与传输层安全 Libraries/LibCryptoLibraries/LibTLS
LibHTTP HTTP/1.1 客户端 Libraries/LibHTTP
LibGfx 2D 图形、图像解码与渲染 Libraries/LibGfx
LibUnicode Unicode 与本地化支持 Libraries/LibUnicode
LibMedia 音频与视频播放 Libraries/LibMedia
LibCore 事件循环、操作系统抽象层 Libraries/LibCore
LibIPC 进程间通信(支撑上述多进程架构的基石) Libraries/LibIPC

除上述组件外,仓库还包含支撑浏览器完整能力的周边库,如 LibURLLibTextCodecLibWebView(WebView 抽象层)、LibDevTools(开发者工具后端)、LibSync 等;底层基础库 AK 位于根目录 AK。多进程之间的通信正是构建在这些库之上:LibIPC 提供连接/编解码原语,LibCore 提供跨平台事件循环,LibWebView 则封装"一个窗口里的 WebView"这一上层概念。

构建前置条件:Qt 6.9+、C++23 编译器、Rust 与 CMake 3.30+

README 将构建指引指向 Documentation/BuildInstructionsLadybird.md,其核心前置要求如下:

  • Qt 6.9 及以上的开发包。注意:部分发行版自带的 Qt6 版本过旧(例如 Debian 13 trixie 只带 Qt 6.8),configure 会直接失败;此时需要安装更新的 Qt 并通过 CMAKE_PREFIX_PATH 指向它;
  • nasm 及额外构建工具;
  • 支持 C++23 的编译器。项目 CI 当前使用 gcc-14 与 clang-21;若系统版本不符,可参考 Meta/Utils/find_compiler.py 查询最低兼容版本;
  • Rust 工具链(用于 Rust 部分构建,可通过 rustup 安装);
  • CMake 3.30 或更新版本需在 $PATH 中可用(根 CMakeLists.txt 声明 cmake_minimum_required(VERSION 3.25),但 CMakePresets.json 要求 3.30,实际以 preset 为准)。

构建文档为各平台给出了完整的一行式依赖安装命令,例如 Debian/Ubuntu:

sudo apt install autoconf autoconf-archive automake build-essential ccache cmake curl \
  fonts-liberation2 git glslang-tools libdrm-dev libgl1-mesa-dev libncurses-dev libpulse-dev \
  libtool nasm ninja-build pkg-config python3-venv qt6-base-private-dev qt6-positioning-dev \
  qt6-tools-dev-tools qt6-wayland tar unzip zip

Arch/Manjaro、Fedora、openSUSE、Void Linux、FreeBSD 与 macOS(brew install 系列命令)均有对应清单;openSUSE Leap 还可能需要 devel:tools:building 仓库以及 Python 3.12 的虚拟环境。第三方依赖由 vcpkg 管理,构建文档特别提醒:FreeBSD 等平台上若缺少 zip/unzip/tar,vcpkg 引导步骤会失败并抛出一个晦涩的 Python CalledProcessError 回溯——这是一个值得记住的排障要点。

构建与运行:Meta/ladybird.py 与 CMake Preset

最简单的构建运行方式是从仓库根目录执行 Meta/ladybird.py

# 从 /path/to/ladybird
./Meta/ladybird.py run

该脚本的命令行接口(见脚本源码 Meta/ladybird.py)支持四个子命令:

子命令 作用
run 构建并在构建主机上运行应用;可带目标名,如 ./Meta/ladybird.py run js 运行 JS REPL
build 仅编译目标二进制
test <pattern> 运行单元测试,可用正则 pattern 过滤(对应 Tests/ 目录)
debug 在 gdb 或 lldb 会话中启动,如 ./Meta/ladybird.py gdb ladybird

常用参数与行为要点:

  • 默认构建 Release 版本;设置环境变量 BUILD_PRESET=Debug(或 --preset 参数)可切换为 Debug。两种构建均带调试符号;
  • --cc / --cxx 指定 C/C++ 编译器,-j 控制并行度,--gui(等价 --ui)选择 UI 框架;
  • macOS 上使用 Homebrew 的 clang 时:
CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++ ./Meta/ladybird.py run

UI 框架的选择

按平台,浏览器前端有三种:macOS 使用原生 AppKit,其他平台使用 Qt,Android 使用原生 Android UI(源码分别位于 UI/AppKitUI/QtUI/Android)。可用 CMake 选项 LADYBIRD_GUI_FRAMEWORK 或 ladybird.py 的 --gui 参数强制指定,例如:

cmake --preset Release -DLADYBIRD_GUI_FRAMEWORK=Qt
# 或
./Meta/ladybird.py run --gui=Qt

Preset 体系与自定义构建目录

CMakePresets.json 定义了 ReleaseDebugSanitizer 三组构建/测试 preset(其中 Sanitizer preset 会设置严格的 ASAN_OPTIONS/UBSAN_OPTIONS),并在 Meta/CMake/presets/ 下按宿主系统引入平台相关 preset。Meta/ladybird.py 与 Release preset 默认把构建目录定为 Build/release

分发包或需要多配置并存时,可自定义构建目录:

cmake --preset Release -B MyBuildDir
# 可选:-DCMAKE_CXX_COMPILER=<compiler> -DCMAKE_C_COMPILER=<matching c compiler>
cmake --build --preset Release MyBuildDir
ninja -C MyBuildDir run-ladybird

注意:使用自定义构建目录时,可能需要显式通过 CMAKE_C_COMPILER / CMAKE_CXX_COMPILER 提供合适的 C++ 编译器。安装规则定义在 UI/cmake/InstallRules.cmake,决定哪些二进制与库会被安装到 CMAKE_PREFIX_PATHcmake --install 指定路径。

内存受限与常见报错

  • 内存受限构建:默认构建会尽可能并行执行所有构建步骤(含链接),大内存机器以外可能吃力。可用 LAGOM_LINK_POOL_SIZE 限制并行链接任务数:
cmake --preset Release -B MyBuildDir -DLAGOM_LINK_POOL_SIZE=2
  • "Unable to find a build program corresponding to "Ninja"":这是构建文档专门澄清的误导性报错。真正原因是 vcpkg 构建第三方依赖(如 skia)失败,Ninja 报错只是表象;应检查终端输出的 vcpkg-manifest-install.log 获取真实错误。

脱离脚本手动运行与调试

ladybird.py 背后执行的是 run-ladybirddebug-ladybird 两个 CMake 自定义目标。不使用脚本时:

# 在 gdb 中自动运行
ninja -C Build/release debug-ladybird

# 直接运行(非 macOS)
./Build/release/bin/Ladybird

# macOS 直接运行 .app 包
open -W --stdout $(tty) --stderr $(tty) ./Build/release/bin/Ladybird.app
# 带参数启动
open -W --stdout $(tty) --stderr $(tty) ./Build/release/bin/Ladybird.app --args https://ladybird.dev

调试工作流方面:CLion 可先用 Debug 构建(-DCMAKE_BUILD_TYPE=Debug)跑起浏览器,再用 Run → Attach to Process 附加到 WebContent 进程进行断点调试;macOS 上构建会自动用 Meta/DebugEntitlements.plist 对 app bundle 签名(含 get-task-allow),因此可直接用 Instruments 分析,而 Xcode 工程方式构建不受支持。

资源文件方面,浏览器运行依赖 Base/res 下的图标、字体与主题文件,这些文件由 CMake 规则拷贝进构建目录;打包者可通过 CMAKE_INSTALL_DATADIR(须为相对 CMAKE_INSTALL_PREFIX 的路径)调整其安装位置。

平台支持

README 声明 Ladybird 可运行于 Linux、macOS、Windows(经由 WSL2)以及众多其他 *Nix 系统。构建文档对 Windows 的说明是:WSL2 是受支持路径(WSL1 已知有问题,MinGW/MSYS2 不受支持);原生 Windows 构建(Clang-CL)仍为实验性,功能受限,需经 Chocolatey 安装 pkg-config 后在 VS 命令行中以 py Meta\ladybird.py build 构建。Android 构建则可在类 Unix 平台装好依赖后参照 Documentation/EditorConfiguration/AndroidStudioConfiguration.md,或直接用 Gradle 运行 UI/Android 下的 gradlew

文档、参与途径与许可

代码相关文档集中在 Documentation/ 目录,值得关注的几篇:LibWeb 从加载到绘制的管线说明进程架构构建排障测试指南高级构建说明

贡献方面:新成员建议先阅读 Documentation/GettingStartedContributing.md;提交 issue 前需遵守 CONTRIBUTING.md 中的 issue 政策(#issue-policy 锚点)与 ISSUES.md 的详细报告指南。许可上,Ladybird 采用 2-clause BSD 许可(见根目录 LICENSE)。

小结

Ladybird README 虽然篇幅不长,但勾勒出了一个清晰的技术轮廓:以 LibWeb/LibJS/LibIPC 等自研(或继承自 SerenityOS 并持续独立的)库栈为基座,以"每标签页独立渲染进程 + 网络与解码全部出进程 + 强沙箱"为安全模型的多进程浏览器。仓库中的 Documentation/ProcessArchitecture.mdServices/ 源码目录与 Documentation/BuildInstructionsLadybird.md 共同构成了从架构到落地的完整证据链——理解这些,就理解了 Ladybird 作为独立浏览器的工程骨架。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
987
504
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384