特权进程与 PTY:newProcess 与 newPtyProcess 的用法差异
newProcess() 在原版 Shizuku 中已被标记弃用,这里被重新启用并保留支持——直接创建特权进程仍然是很多场景最顺手的路径。
newProcess:标准特权进程
val process = Stellar.newProcess(
arrayOf("ls", "-la", "/sdcard"), // 命令与参数
null, // 环境变量(可选)
null // 工作目录(可选)
)
val reader = BufferedReader(InputStreamReader(process.inputStream))
reader.lineSequence().forEach { line -> println(line) }
val exitCode = process.waitFor()
process.destroy()
StellarRemoteProcess 提供标准的三流(stdout/stderr/stdin)与 waitFor、exitValue、destroy,另有 alive() 与带超时的 waitForTimeout。
newPtyProcess:带终端特性的进程
需要颜色输出、Ctrl+C 信号这类终端行为时用 PTY 版本:
val pty = Stellar.newPtyProcess(arrayOf("sh"), null, null)
pty.ptyFd // 读写共用的伪终端文件描述符
pty.resize(80, 24) // 调整终端窗口大小
| 对比项 | StellarRemoteProcess | StellarPtyProcess |
|---|---|---|
| 流结构 | 独立 stdin/stdout/stderr | 单一 fd 的主从伪终端 |
| ANSI 颜色 | 无 | 支持 |
| 信号(如 Ctrl+C) | 不支持 | 支持 |
| 输入回显 | 无 | 默认开启 |
PTY API 自 v1.0.11 加入。终端类应用(在应用里嵌 shell 界面的那种)选 PTY;一次性取输出的场景选普通版。
执行身份与超时注意
进程以服务身份(shell 或 root)执行,权限边界见服务状态解读。旧版本存在命令执行可能卡住的问题(v1.0.18 修复),长时间命令记得用 waitForTimeout 兜底,别裸等 waitFor()。