一个面向 Android 的 root 命令 GUI 工具(Jetpack Compose / Material 3),用于在手机上执行 root 命令、 查看设备状态,并支持从电脑远程调试。
- 信息面板:设备型号、Android 版本、内核版本、架构、SELinux 状态、KernelSU 是否加载、 运行时长、内存、负载、电量、Root 授权状态与 root 通道。
- SELinux 模式:信息页开关一键切 Permissive / Enforcing(
setenforce 0/1),并显示执行结果。 状态读取优先/sys/fs/selinux/enforce,App 域被 selinuxfs 拒绝时自动回退到 root 的getenforce(KSU late-load 会把 SELinux 拉回 Enforcing,用这个开关即可再切回 Permissive,无需重启)。 - 控制台:root 命令执行(
su -c优先,自动回退到 43499 临时 root helper)、 stdout/stderr 分色显示、退出码与耗时、命令历史、快捷命令、复制输出、自动滚动。 - 危险命令拦截:
rmrmdirddmkfsmke2fsmkswapwipeshredfdiskpartedformattune2fsflash_eraseblkdiscard;并递归检查sh -c "..."、su -c "..."、toybox rm等包装内的同类命令。 - 电脑远程调试:App 进程内监听
127.0.0.1:27182(仅回环),电脑上adb forward tcp:27182 tcp:27182后即可用nc/curl/脚本控制。
每行一条命令,回复为 JSON 行:
PING -> {"ok":true,"pong":<ms>}
HELP -> {"ok":true,"commands":[...]}
INFO -> {"ok":true,"info":[{"label":"...","value":"..."},...]}
CMD <base64(cmd)> -> {"type":"stdout"|"stderr","line":"..."} ...
{"type":"exit","code":n,"ms":n}
(危险命令 -> {"type":"blocked","command":"rm"})
示例:
adb forward tcp:27182 tcp:27182
printf 'PING\n' | nc 127.0.0.1 27182
CMD=$(printf 'id; getenforce' | base64 -w0)
printf 'CMD %s\n' "$CMD" | nc 127.0.0.1 27182远程调试通道默认拒绝危险命令(rm/rmdir/dd 等)。若确实需要远程执行,必须在手机 App 里授权:
- 打开 RootExec → 「信息」页 → 「远程授权」卡片;
- 打开总开关「允许远程危险命令」;
- 在「点击添加授权」里逐个添加要放行的命令(如
rm),点已授权 chip 可移除; - 授权后,远程执行危险命令会先返回
{"type":"authorized","command":"rm"},然后再返回 stdout/stderr 与 exit; - 未授权时返回
{"type":"blocked","command":"rm","reason":"需要 App 授权:请在 RootExec 的「远程授权」列表中允许 rm"}; - 「远程执行记录」显示最近 30 条远程执行/拒绝记录(含时间)。
授权状态保存在 SharedPreferences("remote_auth"),重启 App 后仍有效;总开关关闭时,即使列表里有命令也会拒绝。
- 环境:JDK 21、Android SDK 37、Gradle 9.7.1、AGP 9.3.2、Kotlin 2.4.10
- 命令:
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
gradle assembleDebug # 或使用仓库内 Gradle 发行版AGP 9 起内置 Kotlin 支持,因此项目不再显式应用 org.jetbrains.kotlin.android 插件
(仅保留 org.jetbrains.kotlin.plugin.compose)。
- 需要 root(KernelSU / Magisk 的
su,或本机 43499 临时 root helper); - 首次运行需在 KernelSU 管理器中授权;
- 远程调试接口只绑定
127.0.0.1,必须先adb forward才能访问,命令同样经过危险命令过滤。
仅供设备调试与研究使用。