Rust 写的浏览器引擎 Servo 在 5 月 31 日推出了 0.2 版本。这个版本最让人兴奋的不是某个炫酷特性,而是两件长期卡脖子的事终于有了实质进展:CJK(中日韩)语言的渲染与输入支持,以及 Android 端 APK 体积大幅缩减。
对于一直在关注 Servo 的开发者来说,这意味着它从"能跑 demo"往"能日常用"又挪了一步。
CJK 支持:从方块字到可读文本
之前用 Servo 打开任何中文网页,大概率看到的是一片空白或者乱码——字体回退链没覆盖 CJK 区段,输入法事件也没正确传递。0.2 版本在这两方面都做了修补:
- 字体回退:渲染管线现在会优先查找系统中安装的 CJK 字体(如 Noto Sans CJK、思源黑体等),不再一味回退到拉丁字体。
- 输入法集成:Android 和 Linux 桌面端的 IME composition 事件可以正确传递到 Servo 的文本输入框,中文输入法终于能用了。
这对任何想在东亚市场做 Servo 嵌入或二次开发的人是硬性前提。没有 CJK 支持,浏览器引擎在本地就是废的。
Android 端重构:APK 从臃肿到可分发
Servoshell 是 Servo 在 Android 上的演示浏览器应用。0.2 版本对 Android 端做了较大规模的重构,最直观的结果:
- APK 体积缩小约 30%。上一版 Servoshell APK 超过 80MB,这次通过剥离未使用的 WebRender 后端、压缩资源打包策略,降到了更合理的区间。
- 全新历史记录视图,UI 从纯功能性的列表变成了可交互的卡片式设计。
- 渲染管线对移动 GPU 的兼容性改善,部分之前在低端 Android 设备上崩溃的页面现在可以正常渲染。
30% 的体积缩减听起来只是数字,但对移动端分发来说直接决定了用户是否愿意下载试用。
本地构建与运行 Servo
想验证 CJK 支持或测试 Android 构建,最快的方式是从源码跑起来。以下命令在 Ubuntu 22.04+ 或 macOS 上可用:
# 克隆仓库
git clone https://github.com/servo/servo.git
cd servo
# 切到 0.2 发布标签
git fetch --tags
git checkout v0.2
# 桌面端构建与运行(首次编译较慢,约 20-40 分钟)
cargo build --release
./target/release/servo https://zh.wikipedia.org
# 如果只想跑 servoshell(Servo 自带的简易浏览器壳)
cargo run --release --bin servoshell https://www.baidu.com
构建依赖方面,Servo 需要系统安装 python3、curl、pkg-config、libgl-dev(Linux)等。完整依赖列表在仓库的 README.md 中有说明。macOS 用户需确保 Xcode Command Line Tools 已安装。
Android 端构建与 APK 安装
如果你想在 Android 设备上直接测试 Servoshell 0.2:
# 安装 Android 目标的 Rust 工具链
rustup target add aarch64-linux-android armv7-linux-androideabi
# 设置 ANDROID_NDK 环境变量(指向你的 NDK 路径)
export ANDROID_NDK=/path/to/android-ndk-r25c
# 构建 Android APK
cargo install cargo-apk
cargo apk build --release --lib --target aarch64-linux-android
# 生成的 APK 在以下路径,直接安装到设备
adb install ./target/aarch64-linux-android/release/apk/servoshell.apk
注意:NDK 版本建议使用 r25c 或更高,低于 r21 可能遇到链接错误。
cargo-apk目前仍是第三方工具,如果构建失败,可改用仓库自带的./mach build-android脚本,它封装了完整的 Gradle 构建流程。
CJK 字体配置实践
Servo 0.2 的字体回退链已内置 CJK 区段,但如果你在无头环境或自定义嵌入场景中运行,可能需要手动指定字体路径。Servo 通过 prefs 文件做配置:
# 创建用户级 prefs 文件
mkdir -p ~/.servo
cat > ~/.servo/prefs.toml << 'EOF'
# 指定 CJK 回退字体(按优先级排列)
[fonts.cjk-fallback]
families = [
"Noto Sans CJK SC",
"Source Han Sans SC",
"WenQuanYi Micro Hei",
]
# 如果系统没装上述字体,可直接指向文件路径
[fonts.cjk-fallback.paths]
regular = "/usr/share/fonts/truetype/noto/NotoSansCJKsc-Regular.otf"
bold = "/usr/share/fonts/truetype/noto/NotoSansCJKsc-Bold.otf"
EOF
修改后重启 Servo 即生效。你可以打开一个中文页面,用 Ctrl+Shift+I(Servo 目前支持有限的 devtools)检查字体是否正确回退。
现阶段能做什么,还不能做什么
Servo 0.2 的 CJK 支持和 Android 瘦身是实打实的进步,但离"日常使用"仍有距离。几个需要留意的边界:
| 能做 | 还不能做 |
|---|---|
| 正常渲染中文/日文/韩文静态页面 | 复杂 CSS 布局(如 flexbox 嵌套)仍有偏差 |
| Android 端基本浏览与输入 | 视频播放(WebCodecs/H.264 解码尚未完整) |
| 从源码构建桌面端和 Android APK | 生产级安全沙箱(进程隔离仍在开发中) |
如果你在评估 Servo 作为嵌入引擎(比如在 App 内嵌浏览器组件、电子书阅读器的 HTML 渲染层),0.2 版本值得跑一次真实场景测试。对于纯内容展示型的 CJK 页面,渲染质量已经可用;涉及复杂交互或多媒体的场景,建议再等几个版本。
快速验证清单:
- 从源码构建桌面版,打开 3 个你常用的中文网站,截图对比 Chrome 渲染差异。
- 在 Android 设备上安装 Servoshell APK,测试输入法切换和页面滚动流畅度。
- 如果做嵌入场景,用
prefs.toml配置目标设备的 CJK 字体,确认回退链生效。
Servo 的月度发布节奏意味着下一次可见改进大约在 6 月底。CJK 支持的补丁已经合入主线,后续版本大概率会继续打磨字体渲染精度和 IME 交互细节——值得持续跟踪。