主要观点:Firefox 的崩溃报告器虽不是用户常体验的,但很重要,主进程崩溃时需它收集信息。文章详细介绍用 Rust 重写崩溃报告器的方法、原因、独特性及实现细节等。
关键信息:
- 重写原因:原崩溃报告器未得到显著发展,存在诸多问题,如多个 GUI 实现、胶水代码、过时工具产出的二进制文件及无测试套件等,且改进困难易出错,用 Rust 重写可更可靠易维护。
- 独特性:是独立程序,需用最少 Firefox 代码库,避免依赖可能有 bug 的代码,有独特 GUI 需求,不能利用 Firefox 的跨平台渲染,需独立实现跨平台 GUI,避免使用第三方跨平台 GUI 库。
- 实现细节:通过使用简单 UI 模型转化为各平台原生 GUI 代码,定义两个方法 run_loop 和 invoke 实现线程交互,有 4 种 UI 实现(Windows、macOS、Linux、测试),定义模型包含 Application、Window、Element 等,用 ui!宏以声明方式构建 UI,使用 Property 类型处理动态值,通过数据绑定实现事件触发等,注意线程安全,利用 fluent 进行本地化等。
- 测试:重写目标之一是添加测试,通过模拟一切(包括 std 函数),使用线程局部存储设置模拟数据来测试,有测试 UI 可模拟交互和系统副作用,手动测试各 UI 实现与 UI 模型的一致性,自动测试各种 UI 交互对自身状态和环境的影响。
重要细节: - Rust 特性:利用 Rust 的内存安全、类型系统和标准库使代码更可靠全面,虽不支持面向对象继承,但通过定义 Element 结构体和枚举实现元素关系。
- GUI 实现细节:GTK 实现较简单直接,用 bindgen 生成绑定;Windows 实现困难,需手动实现布局等,使用 windows-sys crate 访问 API;macOS 实现有技巧部分,需手动实现菜单等,用 bindgen 生成 Objective-C 绑定;测试 UI 简单,可直接与模型交互。
- 最终产品:重写后外观与之前相同,可解决诸多功能请求和 bug 报告,如检测安装是否损坏等,未来将继续迭代改进。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。