回答
在 Hamibot 中使用 Shell 命令
Hamibot 提供了多种方式来执行 Shell 命令,主要用于与 Android 系统进行底层交互。以下是详细的使用方法和注意事项。
1. 一次性执行单条命令(推荐使用 shell() 函数)
适用于仅需执行一次命令的场景,每次调用 shell() 都会启动一个新的 Shell 进程并执行命令。
语法:
var result = shell(cmd, root);
- cmd:要执行的命令(字符串)。
- root:是否以 root 权限运行,默认为- false。
返回值:
返回一个对象,包含以下属性:
- code:返回码,执行成功为- 0,失败为非- 0。
- result:命令的标准输出(stdout)。
- error:命令的错误输出(stderr)。
示例:
// 强制停止微信
var result = shell("am force-stop com.tencent.mm", true);
log(result);
if (result.code === 0) {
    toast("执行成功");
} else {
    toast("执行失败!请查看错误信息:" + result.error);
}
2. 多次执行命令(推荐使用 Shell 对象)
适用于需要多次执行命令的场景,通过 Shell 对象可以复用同一个 Shell 进程,提高效率。
语法:
var sh = new Shell(root); // 创建 Shell 对象
sh.exec(cmd);              // 执行命令
sh.exit();                 // 退出 Shell 进程
- root:是否以 root 权限运行,默认为- false。
- exec(cmd):执行命令(异步、非阻塞)。
- exit():退出当前 Shell 进程。
示例:
var sh = new Shell(true); // 以 root 权限运行
sh.exec("am force-stop com.tencent.mm"); // 强制停止微信
sh.exit(); // 退出 Shell
3. 监听命令输出(使用 setCallback)
如果需要实时查看命令执行的输出结果,可以使用 setCallback 方法绑定回调函数。
语法:
sh.setCallback({
    onOutput: function(output) {},  // 每次有输出时调用
    onNewLine: function(line) {}    // 每次有新行输出时调用
});
示例:
var sh = new Shell();
sh.setCallback({
    onNewLine: function(line) {
        log(line); // 实时输出每一行结果
    }
});
sh.exec("ping -c 4 www.hamibot.com"); // 执行 ping 命令
sh.exit(); // 退出 Shell
4. 注意事项
- 
权限问题:某些命令需要 root 权限才能执行(如修改系统设置、强制停止系统应用)。如果你不确定是否需要 root 权限,可以先尝试不加 true参数,如果报错Permission denied再加上。
- 
异步执行: Shell.exec()是异步执行的,不会等待命令完成就继续执行后续代码。如果你需要等待命令执行完毕,目前只能通过shell()函数实现。
- 
命令格式:确保命令格式正确,尤其是与 am、pm等命令相关的参数。例如:- 启动微信:am start -n com.tencent.mm/.ui.LauncherUI
- 卸载应用:pm uninstall com.example.app
 
- 启动微信:
- 
调试建议:在调试过程中,建议使用 log()输出结果,或通过setCallback监听输出,以便快速定位问题。
总结
| 方法 | 适用场景 | 是否异步 | 是否复用 Shell 进程 | 推荐使用场景 | 
|---|---|---|---|---|
| shell(cmd, root) | 单次执行 | 否 | 否 | 简单、快速执行单条命令 | 
| Shell对象 | 多次执行 | 是 | 是 | 需要连续执行多条命令,提高效率 | 
| setCallback | 实时监听输出 | 否 | 是 | 需要查看命令执行过程的输出 | 
如需进一步帮助,请参考 Hamibot 官方文档 或发送邮件至 support@hamibot.cn。
                ℹ️ 本回答由 AI 生成,内容仅供参考