ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Ladybird 浏览器全解析:SerenityOS 自研 Web 引擎之上的独立跨平台浏览器

Ladybird 浏览器全解析:SerenityOS 自研 Web 引擎之上的独立跨平台浏览器 Ladybird 浏览器全解析SerenityOS 自研 Web 引擎之上的独立跨平台浏览器【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenityLadybird 是 SerenityOS 生态中基于自研 LibWeb 渲染引擎与 LibJS JavaScript 引擎构建的跨平台 Web 浏览器采用多进程架构目标是成为零第三方运行时依赖的、符合 Web 标准的独立实现。本文以 Ladybird/README.md 为主线结合仓库内源码与 构建文档完整讲解其架构设计、核心组件与从零构建的实战步骤读完即可理解其进程模型并动手在主流平台编译运行。Ladybird 项目定位与当前仓库角色Ladybird 最初诞生于 SerenityOS 项目内部其浏览器 UI 层提供两套跨平台实现基于 Qt6 的通用 GUI 与面向 macOS 的原生 AppKit GUI。需要注意一个重要的仓库现状Ladybird 浏览器项目目前已迁移到独立的 LadybirdBrowser 仓库本仓库SerenityOS monorepo中保留的这一版本其定位是为 LibWeb 与 LibJS 库提供测试便利环境的开发版本即通过 Ladybird 直接驱动 LibWeb/LibJS 进行日常渲染与 JavaScript 功能验证。从构建配置可以看出这一测试驱动定位Ladybird/CMakeLists.txt 的headless-browser目标第 172-178 行与LibWeb/WPT测试目标第 213-228 行紧密关联——headless-browser直接链接了LibWeb、LibJS、LibHTTP、LibTLS、LibCrypto等核心库并以--run-tests模式执行 Tests/LibWeb 下的渲染测试套件。设计目标真正独立的浏览器Ladybird 的核心设计主张是standards-compliant符合标准与 independent独立不依赖业界常见的第三方浏览器组件整个渲染、脚本、网络、图形管线全部由 SerenityOS 自研库提供。README 明确指出当前仅有的外部依赖是 UI 框架Qt6、AppKit以及低层平台库PulseAudio、CoreAudio、OpenGL。这一主张在源码层面得到印证ladybird主目标在 Ladybird/CMakeLists.txt 中链接的库清单为AK LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibSQL LibWeb LibWebView LibProtocol LibURL全部是 SerenityOS 自家库其中领域自研库仓库路径通常替代的第三方方案Web 渲染引擎LibWebBlink、Gecko、WebKitJavaScript 引擎LibJSV8、JavaScriptCore、SpiderMonkeyWebAssemblyLibWasmwasm3、WAMR 等密码学与 TLSLibCrypto / LibTLSOpenSSLHTTP/1.1 客户端LibHTTPlibcurl、WinHTTP2D 图形与图像解码LibGfxSkia、libpng 等归档格式LibArchivelibarchive、zlibUnicode 与区域设置LibUnicode / LibLocaleICU音视频解码LibAudio / LibVideoFFmpeg事件循环与 OS 抽象LibCoreQt、glib 等运行时进程间通信LibIPCD-Bus、gRPC 等多进程架构UI、渲染、网络、Cookie 各司其职README 的 Features 一节阐述了 Ladybird 的进程模型一个主 UI 进程 多个 WebContent 渲染进程 ImageDecoder 进程 RequestServer 进程 SQLServer 进程。其核心动机是安全——图片解码与网络连接均放到进程外执行以增强对恶意内容的抵抗能力每个标签页拥有独立的渲染进程并与系统其余部分隔离sandboxed。进程角色与启动代码印证Ladybird/HelperProcess.h 完整声明了各辅助进程的启动函数launch_web_content_process启动 WebContent 渲染进程接收WebView::ViewImplementation视图引用与WebContentOptions配置launch_image_decoder_process启动 ImageDecoder 进程负责离屏图片解码launch_web_worker_process启动 WebWorker 进程需传入 RequestServer 客户端以建立网络通路launch_request_server_process启动 RequestServer 进程负责全部网络请求可携带资源根目录与证书列表参数launch_sql_server_process启动 SQLServer 进程README 中说明其职责是持有 Cookieconnect_new_request_server_client为新的客户端如 WebWorker建立通往 RequestServer 的新 IPC socket。在 Ladybird/CMakeLists.txt 中可以看到辅助进程的完整清单ImageDecoder RequestServer SQLServer WebContent WebWorker它们作为ladybird与headless-browser的构建依赖被自动编译并且通过set_helper_process_properties被统一放置到libexec输出目录macOS 上则与主程序一起打包进.app目录。辅助进程的查找与资源定位Ladybird/Utilities.cpp 的get_paths_for_helper_process展示了运行时如何定位辅助进程依次尝试$prefix/libexec/process、$prefix/bin/process、应用同目录及当前目录下的同名可执行文件。platform_init第 60-78 行则负责确定资源根目录优先读取~/.lagom或$XDG_CONFIG_HOME/.lagommacOS 上回退到.app/Contents/Resources其他平台回退到$prefix/share/Lagom并据此安装Core::ResourceImplementationFile资源实现。渲染进程的配置参数主进程通过WebContentOptions见 Ladybird/Types.h向 WebContent 进程传递启动配置随后在 Ladybird/HelperProcess.cpp 的launch_web_content_process中转换为命令行参数WebContentOptions 字段对应命令行参数含义is_layout_test_mode--layout-test-mode布局测试模式enable_gpu_painting--use-gpu-painting启用 GPU 绘制enable_experimental_cpu_transforms--experimental-cpu-transforms启用实验性 CPU 变换wait_for_debugger--wait-for-debugger启动后等待调试器附加log_all_js_exceptions--log-all-js-exceptions记录全部 JS 异常enable_idl_tracing--enable-idl-tracing启用 IDL 调用追踪enable_http_cache--enable-http-cache启用 HTTP 缓存expose_internals_object--expose-internals-object暴露 internals 测试对象这些参数在 Ladybird/WebContent/main.cpp 中通过LibCore::ArgsParser逐一解析并直接驱动 LibWeb 内部的全局开关如Web::Fetch::Fetching::g_http_cache_enabled、Web::WebIDL::g_enable_idl_tracing。此外 HelperProcess 还支持以--mach-server-namemacOS与--request-server-socketIPC socket 传递建立跨进程连接。Qt 前端骨架Qt chrome 侧的核心文件位于 Ladybird/Qt 目录包括Application、BrowserWindow多标签窗口、Tab、WebContentView嵌入 WebContent 客户端连接的视图、LocationEdit地址栏、SettingsDialog、InspectorWidget、TaskManagerWindow等构建时由 Ladybird/Qt/CMakeLists.txt 通过qt_add_executable组装仅依赖Qt::Core Qt::Gui Qt::Network Qt::Widgets四个 Qt6 模块。构建与开发从依赖安装到运行调试Ladybird 的完整构建说明见 Documentation/BuildInstructionsLadybird.md以下按该文档骨架完整展开并结合仓库源码补充关键细节。构建前置条件编译器需要支持 C26 的编译器最低要求g-14 或 clang-17Qt6 开发包用于非 macOS 平台的 chrome使用自定义 CMake 构建目录时可通过-DCMAKE_CXX_COMPILER/-DCMAKE_C_COMPILER显式指定编译器g ≥ 14、clang ≥ 14、Apple Clang ≥ 14.3。各平台依赖安装Debian/Ubuntusudo apt install build-essential cmake libgl1-mesa-dev ninja-build qt6-base-dev qt6-tools-dev-tools ccacheUbuntu 20.04 及以上还需安装 Qt6 Wayland 支持sudo apt install qt6-waylandArch Linux/Manjarosudo pacman -S --needed base-devel cmake libgl ninja qt6-base qt6-tools qt6-wayland ccacheFedora 及其衍生版sudo dnf install cmake libglvnd-devel ninja-build qt6-qtbase-devel qt6-qttools-devel qt6-qtwayland-devel ccacheopenSUSEsudo zypper install cmake libglvnd-devel ninja qt6-base-devel qt6-tools-devel qt6-wayland-devel ccacheNixOS 或使用 Nixnix develop .#ladybird # 自定义入口例如你喜欢的 shell nix develop .#ladybird --command bash使用宿主nixpkgs与旧版nix-shell工具时nix-shell Ladybird # 自定义入口 nix-shell --command bash LadybirdmacOS注意 Xcode 14 中 14.3 之前的版本可能在构建 Ladybird 时崩溃建议使用 Xcode 14.3 或 Homebrew 安装的 clang。xcode-select --install brew install cmake ninja ccache若计划在 macOS 上使用 Qt chromebrew install qtOpenIndiana其最新 GCC 移植版GCC 11过旧必须使用仓库中的 Clangpfexec pkg install cmake ninja clang-17 libglvnd qt6Haikupkgman install cmake ninja cmd:python3 qt6_base_devel qt6_tools_devel openal_develWindows优先使用WSL2/WSLg可复用上述任一 Linux 发行版的依赖环境MinGW/MSYS2 不受支持可能以足够多的努力勉强可用原生 Windows 构建clang-cl 或 MSVC均不受支持。方式一通过 serenity.sh 一键构建运行最简单的方式是使用仓库根目录的 Meta/serenity.sh# 在仓库根目录执行 ./Meta/serenity.sh run lagom ladybird ./Meta/serenity.sh gdb lagom ladybird上述命令会根据平台自动选用浏览器 chromeAppKitmacOS 上的原生 chromeQt其他所有平台使用的 chrome。从脚本源码看lagom目标被识别时Meta/serenity.shrun lagom ladybird会在 CMake 参数中加入-DENABLE_LAGOM_LADYBIRDON而 Meta/Lagom/CMakeLists.txt 中一旦ENABLE_LAGOM_LADYBIRD打开ENABLE_LAGOM_LIBWEB会被强制置为 ON即必然编译 LibWeb 与 Ladybird。在非默认平台启用 Qt chrome先安装对应平台的 Qt 依赖再通过 CMake 打开开关# 在仓库根目录执行 cmake -S Meta/Lagom -B Build/lagom -DENABLE_QTON需要重新关闭时以-DENABLE_QTOFF重跑上述命令即可。UI 框架选择逻辑位于 Ladybird/CMakeLists.txtENABLE_QT打开时构建 Qt 子目录否则在 Apple 平台构建 AppKit 子目录其余平台则导出ladybird静态库供其他 chrome 使用。方式二禁用 Ladybird 恢复默认 Lagom 行为注意通过脚本运行 Ladybird 会修改Build/lagom构建目录中的 CMake 缓存使后续用 serenity.sh 启动 QEMU 重建 SerenityOS 时始终编译 LibWeb 与 Ladybird。若想恢复仅从 Lagom 构建代码生成器与工具的默认行为需要手动改回缓存cmake -S Meta/Lagom -B Build/lagom -DENABLE_LAGOM_LADYBIRDOFF -DENABLE_LAGOM_LIBWEBOFF -DBUILD_LAGOMOFF资源文件依赖Ladybird 运行需要 Base/res 目录中的资源文件图标、字体、主题信息。serenity.sh 通过自定义 CMake 目标设置相关变量并确保$PWD正确从而支持从构建目录直接执行。若想不经过脚本直接运行编译产物可调用 ninja 规则或使用 CMake 提供的 install 规则安装 Ladybird。方式三自定义 CMake 构建目录适合独立构建与打包如需独立构建 Ladybird或准备为其打包分发建议使用独立构建目录。Ladybird 既可通过 Meta/Lagom/CMakeLists.txt 构建也可直接使用 Ladybird/CMakeLists.txt面向发行版打包时以 Ladybird 目录作为源码目录最合适。安装规则由 Ladybird/cmake/InstallRules.cmake 定义决定哪些二进制与库会被安装到CMAKE_PREFIX_PATH或cmake --install指定的路径。cmake -GNinja -S Ladybird -B Build/ladybird # 可选-DCMAKE_CXX_COMPILER合适的编译器 -DCMAKE_C_COMPILER匹配的 C 编译器 cmake --build Build/ladybird ninja -C Build/ladybird run自动在 gdb 中运行ninja -C Build/ladybird debug非 macOS 系统直接运行./Build/ladybird/bin/LadybirdmacOS 直接运行.app形式open -W --stdout $(tty) --stderr $(tty) ./Build/ladybird/bin/Ladybird.app # 带参数启动 open -W --stdout $(tty) --stderr $(tty) ./Build/ladybird/bin/Ladybird.app --args https://ladybird.devrun与debug这两个 ninja 目标定义于 Ladybird/CMakeLists.txtrun通过SERENITY_SOURCE_DIR环境变量指定资源根后执行主程序可追加LAGOM_ARGS参数debug则以gdb -ex set follow-fork-mode child附加运行——follow-fork-mode child正是为多进程架构准备的确保断点能跟进到 WebContent 子进程。实验性 GN 构建Ladybird 还存在一套实验性 GN 构建非官方支持由贡献者尽力维护详见 Meta/gn/README.md。相比 CMake 构建GN 的 ninja 规则组织更紧凑部分系统上可能更快GN 还支持在同一构建目录中同时构建宿主与交叉目标便于管理交叉编译时对宿主工具的依赖。OpenIndiana 与 Haiku 的补充要点OpenIndiana 需要额外环境变量以定位 Qt 的 cmake 文件路径包含 Qt 版本号请将 6.2 替换为你安装的版本并强制使用 clang/clang否则会回退到作为系统默认的 GCC 10CMAKE_PREFIX_PATH/usr/lib/qt/6.2/lib/amd64/cmake cmake -GNinja -S Ladybird -B Build/ladybird -DCMAKE_C_COMPILER/usr/bin/clang -DCMAKE_CXX_COMPILER/usr/bin/clang cmake --build Build/ladybird XDG_RUNTIME_DIR/var/tmp ninja -C Build/ladybird run运行 Ladybird 时必须设置XDG_RUNTIME_DIR否则会因找不到可写目录放置 socket 而立即崩溃。Haiku 开箱即支持步骤与 OpenIndiana 相同且无需额外环境变量cmake -GNinja -S Ladybird -B Build/ladybird cmake --build Build/ladybird ninja -C Build/ladybird run调试实践CLion 调试首先以调试符号构建在 Meta/CMake/lagom_compile_options.cmake 中将-O2改为-O0以关闭优化macOS 上再把-g1改为-g保证 lldb 能正确解析符号Linux 上可改为-ggdb3获取最全调试信息按上文用./Meta/serenity.sh run lagom ladybird启动在 CLion 中使用 Run - Attach to Process 连接若调试布局与渲染问题在进程列表中筛选WebContent并附加到该进程之后即可正常使用断点、单步与变量检查。Xcode 调试macOSserenity.sh无法生成 Xcode 工程需手动创建。为兼容脚本需附加若干选项若已存在旧的 Lagom 构建目录CMake 可能会因 generator 变更而报错cmake -GXcode -S Meta/Lagom -B Build/lagom -DBUILD_LAGOMON -DENABLE_LAGOM_LADYBIRDON若不需与serenity.sh兼容也可以直接用 Ladybird 作为源码目录cmake -GXcode -S Ladybird -B Build/ladybird生成后在 Xcode 中打开ladybird.xcodeproj。工程包含大量 target其中许多是生成的代码唯一需要 scheme 的是 ladybird 应用包app bundle。内置测试验证 LibWeb 渲染正确性作为 LibWeb/LibJS 的测试载体Ladybird 在 Ladybird/CMakeLists.txt 中注册了两个 CTest 测试LibWeb以headless-browser --run-tests执行 Tests/LibWeb 下的渲染测试失败时输出--dump-failed-ref-tests便于排查WPTWeb Platform TestsIntegration 配置调用 Tests/LibWeb/WPT/run.sh 运行 Web 平台标准测试套件。两个测试均依赖ladybird目标并设置QT_QPA_PLATFORMoffscreen离屏渲染无需显示服务器与SERENITY_SOURCE_DIR环境变量。对开发者而言这意味着可以方便地在 CI 或本地无头环境中持续回归验证 LibWeb 对 Web 标准的符合度。小结Ladybird 在本仓库中既是可运行的跨平台浏览器更是 LibWeb/LibJS 的实战测试驱动。其价值体现在三个层面架构上通过 UI / WebContent / ImageDecoder / RequestServer / SQLServer 的多进程隔离换来对恶意内容的更强鲁棒性技术栈上从 JS 引擎、渲染引擎到 TLS、图像、音视频全部自研真正践行零第三方依赖工程上提供了从serenity.sh一键构建到独立 CMake/GN 构建、再到 CLion/Xcode 调试的完整开发链路。若需在自己的机器上复现可直接依据本文的 构建文档 按平台安装依赖并执行构建命令。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表