-
Notifications
You must be signed in to change notification settings - Fork 2
Native Layer
AceGuru-mjh edited this page Oct 1, 2026
·
4 revisions
📑 本页目录
platform/terminal/src/main/cpp是终端真实性的来源:真 forkpty、真进程组、真窗口大小信号。 本页讲构建、模块职责、已知缺陷与 host 测试。
| 项 | 值 |
|---|---|
| 构建系统 | CMake 3.22.1 |
| 标准 / 标志 | C++17,-Wall -Wextra -O2,-DANDROID_STL=c++_shared
|
| 产物 | 共享库 apex_terminal
|
| 链接 |
android + log
|
| ABI |
arm64-v8a / armeabi-v7a / x86_64
|
| 源文件 |
pty_engine.cpp/.h、pty_session.cpp/.h、jni_bridge.cpp、ansi_filter.h
|
| Kotlin 侧 |
pty/JniNativePty.kt + pty/NativePty.kt
|
C++ 侧唯一的 Android 依赖是 #include <android/log.h> —— hostTest 已有 shim,因此桌面也能验证。
| 文件 | 职责 |
|---|---|
pty_engine.cpp/h |
PTY 引擎:open/close、read/write、waitForData、isAlive、sendSignal、窗口大小(TIOCSWINSZ) |
pty_session.cpp/h |
forkpty + setsid(真会话 Leader)、进程组管理、waitpid 退出码解析、前台进程组(tcgetpgrp) |
jni_bridge.cpp |
JNI 边界:Java ↔ C++ 的方法映射与异常转换 |
| 能力 | 实现 |
|---|---|
| 真 forkpty |
forkpty + setsid,20 会话并发 host 验证 |
| 窗口大小 | native TIOCSWINSZ → kernel SIGWINCH
|
| 前台组信号 |
signalForegroundGroup(仅 tcgetpgrp)—— Ctrl-C 只杀 job、不杀 shell |
| 超时序列 | TERM → grace → KILL(TimeoutController 三阶段) |
| 退出码 | 真实退出码经 OSC 633 marker 协议上报(T82),不再合成 exitCode = 0
|
| Zombie reaping | 有界 WNOHANG 循环(D-state 交给 init) |
| # | 问题 | 修复 |
|---|---|---|
| N-1 |
readEx/write/sendSignal/isAlive/hasData 全部持同一 mutex_ → session A 的 64KB read 阻塞 session B 一切 IO(100 并发不可达) |
IO 方法改"锁内拷贝 shared_ptr → 锁外执行",mutex_ 只保护 map 结构 |
| N-2 |
close() 内 waitpid 后直接 pid_ = -1 不解析 status → 经 close 路径终止的 session exitCode 恒 -1
|
解析 status |
| N-3 |
exitCode_ 普通 int 跨线程读写 |
改 atomic relaxed |
| N-4 |
close() 阻塞 waitpid(..., 0),D state 进程不退出时永久阻塞 JNI 线程
|
改 WNOHANG 有限重试 |
| N-5 | HUP→TERM→KILL 之间固定 usleep 50/100ms
|
改轮询存活提前退出 |
src/hostTest/native_host_test.cpp 在桌面用真实 forkpty 跑(含 android/log.h 桩):
T81 全量 + T82 前台信号新用例 → ALL PASS。
native host 套件(真实 forkpty)= T81 全量 + T82 fg-signal 新用例 → ALL PASS
| 层 | 谁 |
|---|---|
| 提供可执行的 ELF | rootfs(内置 libubuntu-rootfs.so 解压)+ PRoot 二进制(jniLibs) |
真正 execv
|
pty_session.cpp(local: /system/bin/sh -i;linux: libproot.so … /bin/bash -i) |
| 沙箱语义 | PRoot 用户态 ptrace(见 终端运行时) |
- 终端运行时 · PRoot 二进制溯源
- 终端迁移 · 从源码构建(NDK 27)
-
MCP 生态总览
新 - (沙箱 MCP · 官方 Hub · 逆向 Host · 门控语义)
- 终端运行时
- 终端 API 契约
- SDK 边界
- Termux 能力矩阵
- Ubuntu rootfs 供给
- Ubuntu 生命周期
- PRoot 二进制溯源
- VT100/ANSI 模拟器
- 终端性能
- 终端迁移
- 原生层 C++/JNI