-
Notifications
You must be signed in to change notification settings - Fork 2
Ubuntu Lifecycle
AceGuru-mjh edited this page Oct 1, 2026
·
4 revisions
📑 本页目录
T72–T81 已交付完整的 Ubuntu 安装基础设施,但产品层有 4 个断点。 T82 交付
UbuntuLifecycleCoordinator把 Install → Bootstrap → Capability → Repair → READY → Terminal → Agent → UI 串起来。 来源:docs/ubuntu-lifecycle.md、docs/T82_FINAL_REPORT.md。
| # | 断点 | 证据 |
|---|---|---|
| B-1 | App 启动不感知 Ubuntu 状态(无 reconcile、无状态派生) |
ApexApp.onCreate() 只做 Shizuku / CS-Mem / attachment |
| B-2 | 终端 UI 的"依赖安装中心" 100% 失效 |
DepCatalog 全是 apt 命令,但 ensureSession() 用默认 local backend 创建 Android shell 会话 → apt-get: command not found
|
| B-3 | Agent 拉起 Ubuntu 需 3 次工具调用、自行解读 3 套状态机 |
terminal.ubuntu.install / terminal.linux.bootstrap / terminal.linux.capabilities 三个独立入口 |
| B-4 | crash 后"上次中断在哪"要 Agent 自己探测 | bootstrap 有 isInProgress 标记但产品层无人消费 |
stateDiagram-v2
direction LR
[*] --> NOT_INSTALLED
NOT_INSTALLED --> INSTALLING : install
INSTALLING --> ROOTFS_READY
ROOTFS_READY --> BOOTSTRAPPING : bootstrap
BOOTSTRAPPING --> READY
INSTALLING --> FAILED : 失败(stage, retryable)
BOOTSTRAPPING --> FAILED : 失败(stage, retryable)
FAILED --> NOT_INSTALLED : 重来
NOTE --> RECOVERING : warmUp / repair(过程态,不残留)
| 状态 | 含义 |
|---|---|
NOT_INSTALLED |
无 rootfs |
INSTALLING |
下载/解压中(可续传) |
ROOTFS_READY |
rootfs 就位,未 bootstrap |
BOOTSTRAPPING |
基础包与配置安装中 |
READY |
可用 |
FAILED(stage, retryable) |
任一阶段失败,保留阶段与可重试标志 |
RECOVERING |
过程态:warmUp reconcile / repair,不残留 |
| API | 语义 |
|---|---|
ensureReady(force, timeoutMs) |
幂等单飞编排 install → bootstrap → capability 快照;超时 = IN_PROGRESS(断点续传,进度不丢) |
warmUp() |
App 启动恢复:provisioner.reconcile + 状态派生,绝不下载(用户没同意消耗流量前 App 不替用户做决定) |
refreshState() |
从底层派生 phase(单一事实源仍是 RootfsProvisioner / BootstrapManager,不复制判定逻辑) |
stateFlow / progressFlow()
|
UI/Agent 订阅:phase 转移 + install/bootstrap 双进度聚合 |
cancelInstall() |
install 阶段真取消(字节保留续传);其他阶段诚实 NotSupported
|
repair() |
透传 EnvironmentRepairService,单轮 detect→repair→verify,不触发大下载 |
DEFAULT_ENSURE_TIMEOUT_MS = 15 分钟。
| # | 位置 | 改动 |
|---|---|---|
| ① |
TerminalModule(DI) |
provideUbuntuLifecycleCoordinator @Singleton,适配 UbuntuBootstrapManager(Result 六分支归一化)/ LinuxCapabilityProbe / EnvironmentRepairService / bootstrap progress Flow |
| ② | ToolModule |
注册 terminal.ubuntu.ensure(一键拉起)+ terminal.ubuntu.status(只读快照,零动作) |
| ③ | EnvironmentProvisioner |
新增 ensureUbuntuSession():apt 命令先 ensureReady 再落 linux-ubuntu 会话;不可用则诚实降级 local
|
| ④ | TerminalViewModel |
依赖安装改走 ensureDepInstallSession(),暴露 ubuntuLifecycleState 供 UI 订阅 |
| ⑤ | ApexApp |
initUbuntuLifecycleRecovery():启动 warmUp(reconcile + 派生状态,零下载零 bootstrap) |
Note
terminal.ubuntu.install / terminal.linux.bootstrap / terminal.linux.capabilities /
terminal.linux.repair 全部保留 —— ensure 是聚合入口,不是替代。
-
状态派生而非复制:
derivePhase(hasRootfs, rootfsState, bootstrapState)是纯函数(11 组合矩阵测试),底层单一事实源不动; -
函数端口而非接口:bootstrap / probe / repair 以
suspend (…) -> …注入(生产 DI 适配单例、测试注 fake),不建第二套类抽象(T81 禁令); - 超时 = IN_PROGRESS:与 install 工具同语义,断点续传(Range 下载)+ bootstrap stageEvidence 续跑,进度永不丢失;
- probe 失败不否定 READY:环境可用性与诊断快照分离;
-
RECOVERING 是过程态:
refreshState一律派生事实终态。
status | phase | failedStage | retryable | capabilities
status 工具是只读零动作快照,适合先问再动。
| 项 | 结果 |
|---|---|
UbuntuLifecycleCoordinatorTest |
30 用例:编排顺序 / 幂等 / force / 失败矩阵(install Failed/Busy/Cancelled/异常;bootstrap Failed/InProgress/Busy)/ probe 降级 / 超时续跑 / 并发单飞(10 并发仅 1 次 install) / warmUp 不下载 / crash 中断续跑 / derivePhase 11 组合 / cancelInstall 三态 / repair 三态 |
TerminalUbuntuLifecycleToolTest |
11 用例:READY / ALREADY_READY / FAILED / IN_PROGRESS / probeDegraded / status 只读零动作 |
| 全量回归 | 149 测试类 / 1045 用例 → 1037 绿 + 7 个 forkpty/定时器类环境敏感 flaky(单独运行 19/19 全过,基线与 T82 树一致 → 并发资源竞争,非代码回归) |
| 质量门禁 | 行数 max 633(预算 1200/1600)、括号平衡、无 printStackTrace/反射/TODO、工具 ID 唯一 |
Warning
NOT VERIFIED(如实声明,绝不写 PASS):
① 真机全链(真实下载 → 真 apt → Ubuntu 会话 → apt 装包 → 终端可见);
② ensureReady 15 分钟超时预算是估计,未做真机采样校准;
③ ApexApp.warmUp 在真进程的启动时序。
-
MCP 生态总览
新 - (沙箱 MCP · 官方 Hub · 逆向 Host · 门控语义)
- 终端运行时
- 终端 API 契约
- SDK 边界
- Termux 能力矩阵
- Ubuntu rootfs 供给
- Ubuntu 生命周期
- PRoot 二进制溯源
- VT100/ANSI 模拟器
- 终端性能
- 终端迁移
- 原生层 C++/JNI