shell 终端
shell 即 Unix Shell,在类 Unix 系统提供与操作系统交互的一系列命令。
很多程序可以用来执行 shell 命令,例如终端模拟器。
在 Auto.js 大致等同于用 adb 执行命令 "adb shell"。
其实现包括两种方式:
- 通过
java.lang.Runtime.exec
执行(shell, Tap, Home 等函数) - 通过内嵌终端模拟器执行(RootAutomator, Shell 等对象)
稳定性: 稳定
shell(cmd[, root])
- cmd {string} 要执行的命令
- root {Boolean} 是否以 root 权限运行,默认为 false。
- return {ShellResult} 运行结果
一次性执行命令 cmd, 并返回命令的执行结果。返回对象的其属性如下:
- code {number} 返回码。执行成功时为 0,失败时为非 0 的数字。
- result {string} 运行结果(stdout 输出结果)
- error {string} 运行的错误信息(stderr 输出结果)。例如执行需要 root 权限的命令但没有授予 root 权限会返回错误信息"Permission denied"。
示例(强制停止微信):
var result = shell("am force-stop com.tencent.mm", true);
log(result);
console.show();
if (result.code == 0) {
toast("执行成功");
} else {
toast("执行失败!请到控制台查看错误信息");
}
Shell
稳定性: 稳定
shell 函数通过用来一次性执行单条命令并获取结果。如果有多条命令需要执行,用 Shell 对象的效率更高。这是因为,每次运行 shell 函数都会打开一个单独的 shell 进程并在运行结束后关闭他,这个过程需要一定的时间;而 Shell 对象自始至终使用同一个 shell 进程。
new Shell(root)
- root {Boolean} 是否以 root 权限运行一个 shell 进程,默认为 false。这将会影响其后使用该 Shell 对象执行的命令的权限
Shell 对象的"构造函数"。
var sh = new Shell(true);
//强制停止微信
sh.exec("am force-stop com.tencent.mm");
sh.exit();
Shell.exec(cmd)
cmd
{string} 要执行的命令
执行命令 cmd。该函数不会返回任何值。
注意,命令执行是"异步"的、非阻塞的。也就是不会等待命令完成后才继续向下执行。
Shell.execAndWaitFor(cmd)
v7.1.1 新增
cmd
{string} 要执行的命令- return {ShellResult} 运行结果
执行 shell 命令并等待运行结果
Shell.exit()
直接退出 shell。正在执行的命令会被 强制退出。
Shell.exitAndWaitFor()
执行"exit"命令并等待执行命令执行完成、退出 shell。
此函数会执行 exit 命令来正常退出 shell。
Shell.setCallback(callback)
- callback {Object} 回调函数
设置该 Shell 的回调函数,以便监听 Shell 的输出。可以包括以下属性:
- onOutput {Function} 每当 shell 有新的输出时便会调用该函数。其参数是一个字符串。
- onNewLine {Function} 每当 shell 有新的一行输出时便会调用该函数。其参数是一个字符串(不包括最后的换行符)。
例如:
var sh = new Shell();
sh.setCallback({
onNewLine: function (line) {
//有新的一行输出时打印到控制台
log(line);
},
});
while (true) {
//循环输入命令
var cmd = dialogs.rawInput("请输入要执行的命令,输入exit退出");
if (cmd == "exit") {
break;
}
//执行命令
sh.exec(cmd);
}
sh.exit();
ShellResult
运行 shell 得到的结果,是包含如下属性的对象
- code {number} 返回码。执行成功时为 0,失败时为非 0 的数字。
- result {string} 运行结果(stdout 输出结果)
- error {string} 运行的错误信息(stderr 输出结果)。例如执行需要 root 权限的命令但没有授予 root 权限会返回错误信息"Permission denied"。
附录: shell 命令简介
以下关于 shell 命令的资料来自AndroidStudio 用户指南:Shell 命令。
am 命令
am 命令即 Activity Manager 命令,用于管理应用程序活动、服务等。
以下命令均 以"am "开头,例如shell('am start -p com.tencent.mm');
(启动微信)
start [options] intent
启动 intent 指定的 Activity(应用程序活动)。
请参阅 intent 参数的规范。
选项包括:
- -D:启用调试。
- -W:等待启动完成。
- --start-profiler file:启动分析器并将结果发送到 file。
- -P file:类似于 --start-profiler,但当应用进入空闲状态时分析停止。
- -R count:重复 Activity 启动 count 次数。在每次重复前,将完成顶部 Activity。
- -S:启动 Activity 前强行停止目标应用。
- --opengl-trace:启用 OpenGL 函数的跟踪。
- --user user_id | current:指定要作为哪个用户运行;如果未指定,则作为当前用户运行。
startservice [options] intent
启动 intent 指定的 Service(服务)。
请参阅 intent 参数的规范。
选项包括:
- --user user_id | current:指定要作为哪个用户运行;如果未指定,则作为当前用户运行。
force-stop package
强行停止与 package(应用包名)关联的所有应用。
kill [options] package
终止与 package(应用包名)关联的所有进程。此命令仅终止可安全终止且不会影响用户体验的进程。
选项包括:
- --user user_id | all | current:指定将终止其进程的用户;如果未指定,则终止所有用户的进程。
kill-all
终止所有后台进程。
broadcast [options] intent
发出广播 intent。 请参阅 intent 参数的规范。
选项包括:
- [--user user_id | all | current]:指定要发送到的用户;如果未指定,则发送到所有用户。