Skip to content

Terminal Emulator

AceGuru-mjh edited this page Oct 1, 2026 · 4 revisions

VT100/ANSI 终端模拟器

🖥️ 终端 & Linux · 🏠 首页 › Terminal-Emulator

Home Version Kotlin Modules Tools License

Terminal-Emulator

📑 本页目录

:terminal-emulator 是项目自研的终端渲染引擎(vendored,源自 ATR Phase 2), 把 guest 进程吐出的字节流还原成一块可渲染的字符屏幕模型。

1. 边界约束

Caution

:terminal-emulator 不得依赖 :platform:terminal。 这条铁律写在模块 build.gradle.kts 的注释里(模块依赖列表为空,仅有测试用 junit)。

理由:模拟器是通用视图组件,应当能被任何终端使用者复用;一旦反向依赖平台层, 可移植性与单测性都会崩塌。方向只能是:platform:terminal → terminal-emulator。

2. 职责

职责 说明
转义序列解析 VT100 / ANSI escape sequences(光标移动、擦除、SGR 等)
屏幕模型 字符矩阵 + 属性(前景/背景/粗体/下划线等),滚动区(DECSTBM)支持
颜色 支持 24 位真彩(38;2;r;g;b)与 256 色,向下兼容 16 色
UTF-8 解码 流式边界安全的增量解码(宽字符 / 组合字符场景)
滚动缓冲 回滚缓冲区(backscroll)
与 PTY 解耦 只吃 feed(bytes),不关心字节来自 forkpty、ssh 还是文件

3. 数据流位置

guest 进程 → PTY(C++ forkpty)→ PtyOutputPump(背压)→ terminal-emulator.feed() → 屏幕模型
                                                                                   ↓
                                                                      Compose 渲染(TerminalScreen)

注意:模拟器不知道字节来自哪里(可以是 forkpty、SSH、也可以是测试里的 fixture 文件),

4. 为什么要自研

可选方案 为什么没用
直接套 Termux 的 terminal-view / JNI 输出 需要重走 JNI 同步语义,且与本项目 semantics reducer(等待输入判定)耦合困难
纯 Compose Text 堆字符 无 ANSI 语义、无滚动区、性能撑不住持续输出
WebView + xterm.js 引入 WebView 运行时,体积与不可控性都不可接受

自研的收益:小、可控、能被 SemanticStateReducer 精确驱动("是否在等待输入"这件事对 Agent 至关重要)。

5. 测试

模块自带 core 路径的单测(VT100 核心:转义序列、滚动、字符集),并参与 app / platform:terminal 的连线测试。参见 测试体系。

6. 相关页面

footer

🏠 返回首页 · 📚 文档索引 · ❓ FAQ · 🔧 故障排查 · 🗺️ 路线图 · 🐛 提 Issue

Android Guru Agent · v1.4.4 · Kotlin 2.0.21 · Compose · PRoot · Room

Clone this wiki locally