
受够了当“专业窗口管理员”
如果你开发过 React Native 或 Flutter 应用,肯定懂这种痛苦。问题不在于写代码,而在于繁杂的额外开销。
我的日常工作基本上就是和操作系统“搏斗”。打开编辑器,启动构建,然后把 Android 模拟器拖到屏幕一边。接着发现还需要在 iOS 上检查布局 Bug,于是又得打开 Simulator。
突然间,我那 14 英寸的 MacBook 屏幕就成了重叠窗口的“坟墓”。我花在 Alt-Tab 切换和调整 Android Studio 与 Xcode 窗口大小上的时间,比实际写功能的时间还要多。
压死骆驼的最后一根稻草是上下文切换。每次从代码跳转到单独的模拟器窗口,我都会打断思路。
这种微小的精神损耗累积起来,到了下午四点就会变成巨大的头痛。我极其讨厌仅仅为了看应用运行,就不得不让那些笨重且吞噬资源的 IDE 一直开着。
我不想要什么“工具套件”。我只想要一个真正懂移动开发者的工具——能让我同时看到代码和设备界面,且没有杂乱的窗口。
因此我坐下来思考:如果我专为移动开发者打造一款 IDE,彻底消除这种摩擦感会怎样?UMIDE(Unified Mobile IDE)就这样诞生了。
我到底做了什么
UMIDE 绝不是 VS Code 的华丽外衣。我不想要 Electron 的笨重,也不想要成千上万无用插件带来的开销。我使用 Rust 从零开始构建,底层基于 Lapce——毫不夸张地说,这是我用过最快的编辑器之一。
- 极致的流畅:Rust 从不拖泥带水。编辑器的响应速度仿佛能跟上你的思维,而不是让你等待它。
- 专业的工具链:我从第一天起就确保 LSP 支持(自动补全、诊断)和 Vim 模式足够稳定。既然我自己做 IDE,肯定要自己用,没有 Vim 快捷键我活不下去。
- 内嵌模拟器:这是核心目标。Android 和 iOS 都只是 IDE 内部的专属面板。调整编辑器大小,模拟器会随之缩放。听起来微不足道,但一旦用过,你就再也回不去浮动窗口了。
那些差点让我崩溃的难题
在另一个应用中内嵌实时模拟器,听起来像是个有趣的周末项目。但实际花费的时间远超预期。
1. 与 Android 的搏斗
Android 其实有一个非常酷的 gRPC 端点,可以流式传输 H.264 视频。我最终用 Rust 写了一个 gRPC 客户端来捕获这些帧,但接着就得想办法解码它们,同时不能把我的笔记本变成取暖器。我使用了 VideoToolbox 进行硬件加速,确保一切流畅无卡顿。
2. iOS 的噩梦
iOS 才是真正的挑战。Apple 可不会直接“给”你一个视频流。Simulator 是一个完全封闭的环境。我不得不硬着头皮使用 Objective-C++ 和 C++,将 macOS 原生 API 桥接到 Rust 中。
我构建了一个自定义的 crate(umide_native),将所有丑陋且不安全的 FFI 代码隐藏起来,这样我就能用简洁的 API 从 Rust 中调用它:
let view = NativeEmulatorView::new(handle, x, y, width, height, EmulatorPlatform::Ios)?;
view.attach_device(&device_id);
view.show();
3. “Flexbox” 墙
UMIDE 的 UI 使用了 Floem,这是一个 GPU 加速的 Rust 框架。有段时间,模拟器面板死活无法填满屏幕。我花了三个小时追踪一个布局 Bug,最后才发现是底层引擎中的 flexbox 怪癖。当父级高度是动态的时候,height: 100% 根本不起作用。我最终把所有东西都换成了 flex_grow(1.0)。
除了布局,我还必须解决“嵌入缝隙”的问题。我最终 Fork 了 Floem 并修补了本地版本,以暴露原始窗口句柄。
简单来说:我需要一种方式让 UI 框架直接与操作系统的窗口系统“对话”。这使得 C++ 代码能够精准找到 UMIDE 窗口在屏幕上的位置,从而将模拟器视图完美地“缝合”到 Rust 渲染的界面中。
“最终 Boss”:应用分发
写代码是很有趣的部分。但在 macOS 上发布应用,简直就是一场炼狱之旅。
每一次构建都必须进行代码签名,提交给 Apple 进行“公证”,然后再“装订”。如果你漏掉任何一步,macOS 就会把你的应用当成恶意软件。我花了整整一个星期才把这些流程全部接入 GitHub Actions,从而实现推送 tag 时自动为 Intel 和 Apple Silicon 构建并公证 DMG 安装包。
经验与总结
- Rust 的痛苦是值得的。学习曲线很陡峭,与借用检查器的斗争也是真实的,但一旦你的代码编译通过,它就能稳定运行。我在语言边界处没有遇到过一次“神秘崩溃”。
- Flexbox 是通用的。无论我是写 CSS、SwiftUI 还是 Rust UI 代码,心智模型都是一样的。掌握了 Flexbox,你就能构建任何界面。
- 尽早发布。我本可以再花一年时间打磨每一个像素,但我现在就需要这个工具。
亲自体验一下
如果你和我一样厌倦了管理窗口,不妨试试它。这是开源项目,我很乐意听到你的反馈。
- GitHub: github.com/bridgerust/umide
- 下载: 获取 macOS DMG 安装包
Windows 和 Linux 的支持已在路线图上(模拟器是难点所在),但 IDE 本身已经准备就绪。
构建它用了大量的 Rust,一点 Objective-C,以及过量的咖啡因。
夜雨聆风