Skip to content

Native Layer

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

原生层:C++ / JNI / NDK

🖥️ 终端 & Linux · 🏠 首页 › Native-Layer

Home Version Kotlin Modules Tools License

Native-Layer

📑 本页目录

platform/terminal/src/main/cpp 是终端真实性的来源:真 forkpty、真进程组、真窗口大小信号。 本页讲构建、模块职责、已知缺陷与 host 测试。

1. 构建

项 值
构建系统 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,因此桌面也能验证。

2. 三个文件各自负责什么

文件 职责
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++ 的方法映射与异常转换

3. 关键能力

能力 实现
真 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)

4. 曾有的缺陷(T81 N-1 ~ N-5)

# 问题 修复
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 改轮询存活提前退出

5. host 测试

src/hostTest/native_host_test.cpp 在桌面用真实 forkpty 跑(含 android/log.h 桩): T81 全量 + T82 前台信号新用例 → ALL PASS。

native host 套件(真实 forkpty)= T81 全量 + T82 fg-signal 新用例 → ALL PASS

6. 与 rootfs / PRoot 的分工

层 谁
提供可执行的 ELF rootfs(内置 libubuntu-rootfs.so 解压)+ PRoot 二进制(jniLibs)
真正 execv pty_session.cpp(local: /system/bin/sh -i;linux: libproot.so … /bin/bash -i)
沙箱语义 PRoot 用户态 ptrace(见 终端运行时)

7. 相关页面

footer

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

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

Clone this wiki locally