博客

WebKitGTK 是什么,以及找不到 appindicator 库

原理与选择 · · 约 10 分钟

WebKitGTK 是 WebKit 移植到 GTK 上的版本,Safari 用的也是 WebKit 这个引擎,Linux 上的 Tauri 和 Pake 窗口画页面,用的是发行版自己装的那一份。要自己构建,Debian 和 Ubuntu 装 libwebkit2gtk-4.1-dev,Arch 装 webkit2gtk-4.1,Fedora 装 webkit2gtk4.1-devel。同时还得有 appindicator 库,不然构建会停在 Can't detect any appindicator library。构建已经通过、窗口却是空白的,先看渲染方式,WebKitGTK 2.52 及更新版本上 Pake 会保住视频需要的硬件加速,改走共享内存,PAKE_LINUX_WEBKIT_SAFE_MODE=1 则切回原来的保守模式。

WebKitGTK、WebKit 和 Safari 各是哪一层

WebKit 是浏览器引擎,Safari、邮件、App Store,以及 macOS、iOS 和 Linux 上的不少应用都用它。WebKitGTK 是这个引擎给 GTK 的移植,也是 GNOME 平台官方的网页引擎,Epiphany 这类浏览器嵌的就是它。应用要在 GTK 窗口里放页面,链接的就是这份库,Mac 上的 Safari 是同一项目的另一份构建,跟着 macOS 更新,WebKitGTK 则跟着发行版的软件包走。Tauri 的 webview 说明写明 Linux 走 webkit2gtk,该信的版本是发行版仓库里的那一个。Mac 上对应的是 WKWebView,Windows 上对应的是 WebView2。

从 WebKit2 起,页面跑在应用进程外面,项目自己的说法是,这样网页既不会把主程序弄崩溃,也不会把界面卡死。Pake 的常见问题把 Linux 上的页面进程叫做 WebKitWebProcess,启动失败时点名的辅助进程是 WebKitNetworkProcess。同一页还写到,WebKitGTK 可以用 GPU 做合成、滚动、3D CSS 和 WebGL,空白窗口动的就是这条路径。

4.0 和 4.1 该装哪一个

4.0 和 4.1 是 API 的名字,WebKit 的发布号是另一套 2.x。Debian bookworm 上 libwebkit2gtk-4.0-dev 的说明写的是 API 4.0,网络用 libsoup v2,界面用 GTK 3。trixie 上 libwebkit2gtk-4.1-dev 的说明写的是 API 4.1,界面用 GTK 3,并且依赖 libsoup-3.0-dev。bookworm 上这两个包都是 2.50.6,所以这一版的 4.1 仍是同一份引擎,换的是 HTTP 库和 pkg-config 名字。libwebkitgtk-6.0-dev 是 API 6.0,界面用 GTK 4,Pake 查找的名字则是 webkit2gtk-4.1。Debian 13 和 Ubuntu 24.04 已经拿掉了 libwebkit2gtk-4.0-dev。Ubuntu 22.04 和 Debian 12 还在提供,22.04 那个包依赖 libsoup2.4-dev。

Pake 在 Linux 上链接的 Rust crate 是 webkit2gtk 2.0.2,打开了 v2_38,Tauri 2.10.2 又给同一个 crate 打开了 v2_40,所以构建用的是 v2_40。对应的 webkit2gtk-sys 2.0.2 通过 pkg-config 查找模块 webkit2gtk-4.1,这个 feature 把要求的版本定在 2.40 或更新。crate 依赖 soup3,4.0 的开发文件是另一个模块,这次查找对不上。

包名来自 Tauri 的准备页和 Pake 的进阶用法。WebKit 和托盘相关的是这几条。

sudo apt update
sudo apt install libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev libsoup-3.0-dev libgtk-3-dev libayatana-appindicator3-dev
sudo pacman -S --needed webkit2gtk-4.1 libappindicator-gtk3
sudo dnf install webkit2gtk4.1-devel libappindicator-gtk3-devel

2026 年 11 月 7 日,WebKitGTK 网站上的稳定源码包是 2.54.2。同一天,Arch 的 webkit2gtk-4.1 是 2.54.2-1,Fedora 43 到 45 以及 Rawhide 的 webkit2gtk4.1-devel 是 2.54.2。Debian 13 的 amd64 是 2.54.0,armel 和 s390x 页面上写的是 2.52.6,Debian 12 是 2.50.6。Ubuntu 24.04 的 amd64 和 i386 是 2.52.6,该页上的其他架构是 2.44.0。Ubuntu 22.04 的 amd64 和 i386 是 2.50.4,其他架构写的是 2.36.0,比绑定要求的 2.40 更旧。

Pake 读的是当前加载的库,用 WebKit 的主版本号和次版本号,2.52 及更新走共享内存,2.50 和 2.44 留在旧的兼容参数上。构建之前先跑 pkg-config --modversion webkit2gtk-4.1,它打印这次查找会拿到的版本,模块不在时直接报错,不用等 pake 跑一遍才知道。

Tauri 和 Pake 为什么会链上它

Linux 上 Tauri 的窗口是 GTK,页面是系统里的 WebKitGTK,所以构建时要有开发包,运行时要有共享库。Pake 的工作原理也是这一路,pake 命令编译一份 Tauri 模板,安装包能小,是因为引擎留在系统上。Tauri 和 Electron把这和自带 Chromium 的外壳放在一起比较。

Debian 和 Ubuntu 上的共享库是 libwebkit2gtk-4.1-0。Pake 锁文件里的 tauri-cli 2.10.0 会把这个名字写进 .deb 的依赖,并把 libwebkit2gtk-4.1.so.0 算进打包要跟踪的库。Arch 的 webkit2gtk-4.1 提供 libwebkit2gtk-4.1.so。

托盘是另一项检查,Pake 的 Cargo.toml 打开了 Tauri 的 tray-icon feature,这个 feature 编进每一次 Pake 构建,包括没有托盘图标的应用。只要它开着,tauri-cli 2.10.0 在 Linux 上打包就会查找 appindicator,先问 pkg-config 要 ayatana-appindicator3-0.1,没有再要 appindicator3-0.1。

构建报 Can't detect any appindicator library

Pake 的常见问题在 Ubuntu 24.04 及更新版本上写出了这句。

Can't detect any appindicator library

Ubuntu 24.04 及更新版本用 libayatana-appindicator3-dev 换掉了 libappindicator3-dev。

sudo apt-get update
sudo apt-get install -y libayatana-appindicator3-dev

Fedora 和其他 RPM 发行版上,同一篇常见问题用的是下面这条。

sudo dnf install -y libappindicator-gtk3-devel

Arch 上前面那条命令里的 libappindicator-gtk3 现在落到 libappindicator 这个包,它带的是 appindicator3-0.1。打包器两个 pkg-config 模块都接受,所以旧的 libappindicator3-dev 还在的话,检查也能过。常见问题还把旧版本上的 Icon RGBA 错误指到这些包。

装好以后用原来的 pake 命令再构建一次。缺的是 webkit2gtk-4.1 时,失败出在 WebKit 那次查找,报的是另一句话。这句 Can't detect any appindicator library 表示两个托盘模块都不在,安装命令以 CLI 常见问题 为准。

窗口空白、点不了,以及 DMABUF

在一些纯 Wayland 合成器上,尤其是 niri,窗口能打开,点击或键盘进不到页面,另一些机器上窗口是空白的,niri 会话里 Pake 已经避开保守的 WebKit 参数。要在别的环境里走同一条原生路径,用这条启动。

PAKE_LINUX_WEBKIT_SAFE_MODE=0 ./myapp.AppImage

如果窗口变成空白,再把保守的办法加回去。

PAKE_LINUX_WEBKIT_SAFE_MODE=1 ./myapp.AppImage

1 会设置 WEBKIT_DISABLE_DMABUF_RENDERER 和 WEBKIT_DISABLE_COMPOSITING_MODE。不设这个变量时,WebKitGTK 2.52 及更新版本上,X11 和 Wayland 都改用共享内存渲染,也就是 WEBKIT_DMABUF_RENDERER_FORCE_SHM=1,这两个关闭参数保持不设,视频需要的硬件加速因此还在。更旧的 WebKitGTK 继续用兼容参数,niri 保持原生渲染,你已经自己导出过某个 WebKit 变量的话,Pake 会保留你设的值。

0 会去掉那两个关闭参数,并且跳过自动加上的兼容办法,包括共享内存,因为启动在加上它之前就返回了。库是 2.52 或更新、出问题的是视频时,不要设这个变量,Pake 的启动代码把 2.52 上的这两个关闭参数都当成关掉硬件加速。

改完以后看三件事,页面看得见,页面上的按钮点得着,视频能播。2.52 或更新版本上如果只有视频失败,去掉这个变量再启动一次。

发行版软件包里的 GNOME Web 用的是同一份库,在它里面打开 webkit://gpu 能看到引擎的状态。页面会列出 WebKit 版本,Buffer format 那一项以 DMA-BUF 或 Shared Memory 开头,能看出这个窗口走的是哪条路。

启动时找不到 WebKitNetworkProcess

本地打出来的 AppImage 可能一启动就退出,错误里是下面这句。

"././/lib/webkit2gtk-4.1/WebKitNetworkProcess" (No such file or directory)

常见问题把这限定在非 Debian 发行版上本地构建的 AppImage,比如 Arch 或 Fedora,Pake 官方的 AppImage 在基于 Debian 的环境里构建。tauri build 会改写 libwebkit2gtk*.so 里的辅助进程路径,并按 Debian 的布局复制这些程序,目录是 /usr/lib/<架构三元组>/webkit2gtk-4.1。Arch 上这些程序在 /usr/lib/webkit2gtk-4.1,改写后的路径就对不上了。

在 Arch 上改出 pacman 包,辅助进程就留在系统路径上。Pake 在 Linux 上会把名字转成小写,--name MyApp 打出来的是 myapp-*.pkg.tar.zst。

pake https://example.com --name MyApp --targets zst
sudo pacman -U myapp-*.pkg.tar.zst

已经打好的 AppImage,常见问题的办法是解包,把 lib/webkit2gtk-4.1 链到 usr/lib/webkit2gtk-4.1,再运行 AppRun,同一节还写了用 Debian 镜像构建。

什么时候留在浏览器里更合适

Pake 的常见问题写到,有些网站,比如 ChatGPT,会在页面前放 Cloudflare 检查,系统网页视图,尤其是 WebKitGTK,经常在这项检查上打转,就算加了 --user-agent 也过不去。常见问题给出的办法是用普通浏览器或原生客户端,Google 拒绝嵌在应用里的网页视图登录时,给出的也是这个办法。GNOME Web 是常见问题里点名的 WebKitGTK 浏览器,页面在那里也失败,问题多半在引擎这边。自带 Chromium 的外壳,比较在 Tauri 和 Electron。

常见问题

WebKitGTK 和 Safari 是同一份构建吗?

Safari 那份跟着 macOS 更新。WebKitGTK 是发行版的软件包,2026 年 11 月从 Ubuntu 22.04 部分架构上的 2.36,到 Arch 和 Fedora 上的 2.54.2 都有。

装 4.0 的开发包能通过 Pake 的构建吗?

Pake 查找的是 pkg-config 模块 webkit2gtk-4.1,版本要 2.40 或更新。API 4.0 链接的是 libsoup 2,Debian 13 和 Ubuntu 24.04 已经没有 libwebkit2gtk-4.0-dev 这个包。

Can't detect any appindicator library 是不是没装 WebKit?

这句 panic 来自 tauri-cli 2.10.0,因为 tray-icon 开着,它先找 ayatana-appindicator3-0.1,再找 appindicator3-0.1。Pake 每次构建都打开这个 feature。

PAKE_LINUX_WEBKIT_SAFE_MODE 什么时候设成 1?

窗口空白用 1,页面看得见、点击或键盘进不去用 0。WebKitGTK 2.52 或更新、出问题的是视频时不要设,启动才会自己加上共享内存渲染。

别人做好的应用还要装 -dev 包吗?

运行要的是共享库,Debian 和 Ubuntu 上是 libwebkit2gtk-4.1-0,tauri-cli 2.10.0 会把它写进 .deb 的依赖,编译才要 -dev 包。在 Arch 上打的 AppImage 仍可能找不到 WebKitNetworkProcess,这时用 --targets zst。