-
Notifications
You must be signed in to change notification settings - Fork 2
Terminal Emulator
AceGuru-mjh edited this page Oct 1, 2026
·
4 revisions
:terminal-emulator是项目自研的终端渲染引擎(vendored,源自 ATR Phase 2), 把 guest 进程吐出的字节流还原成一块可渲染的字符屏幕模型。
Caution
:terminal-emulator 不得依赖 :platform:terminal。
这条铁律写在模块 build.gradle.kts 的注释里(模块依赖列表为空,仅有测试用 junit)。
理由:模拟器是通用视图组件,应当能被任何终端使用者复用;一旦反向依赖平台层,
可移植性与单测性都会崩塌。方向只能是:platform:terminal → terminal-emulator。
| 职责 | 说明 |
|---|---|
| 转义序列解析 | VT100 / ANSI escape sequences(光标移动、擦除、SGR 等) |
| 屏幕模型 | 字符矩阵 + 属性(前景/背景/粗体/下划线等),滚动区(DECSTBM)支持 |
| 颜色 | 支持 24 位真彩(38;2;r;g;b)与 256 色,向下兼容 16 色 |
| UTF-8 解码 | 流式边界安全的增量解码(宽字符 / 组合字符场景) |
| 滚动缓冲 | 回滚缓冲区(backscroll) |
| 与 PTY 解耦 | 只吃 feed(bytes),不关心字节来自 forkpty、ssh 还是文件 |
guest 进程 → PTY(C++ forkpty)→ PtyOutputPump(背压)→ terminal-emulator.feed() → 屏幕模型
↓
Compose 渲染(TerminalScreen)
注意:模拟器不知道字节来自哪里(可以是 forkpty、SSH、也可以是测试里的 fixture 文件),
| 可选方案 | 为什么没用 |
|---|---|
| 直接套 Termux 的 terminal-view / JNI 输出 | 需要重走 JNI 同步语义,且与本项目 semantics reducer(等待输入判定)耦合困难 |
| 纯 Compose Text 堆字符 | 无 ANSI 语义、无滚动区、性能撑不住持续输出 |
| WebView + xterm.js | 引入 WebView 运行时,体积与不可控性都不可接受 |
自研的收益:小、可控、能被 SemanticStateReducer 精确驱动("是否在等待输入"这件事对 Agent 至关重要)。
模块自带 core 路径的单测(VT100 核心:转义序列、滚动、字符集),并参与 app / platform:terminal
的连线测试。参见 测试体系。
-
MCP 生态总览
新 - (沙箱 MCP · 官方 Hub · 逆向 Host · 门控语义)
- 终端运行时
- 终端 API 契约
- SDK 边界
- Termux 能力矩阵
- Ubuntu rootfs 供给
- Ubuntu 生命周期
- PRoot 二进制溯源
- VT100/ANSI 模拟器
- 终端性能
- 终端迁移
- 原生层 C++/JNI