拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Autojs基础-Shell命令(shell)

1.前言autojs的shell命令类似于adb执行“adb shell”命令就是将adb命令中的前缀“adb shell”去掉后缀部分通过autojs给出的方式执行。当然shell命令执行需要在root环境下才能生效。autojs对adb shell命令大多数情况是支持的但涉及内存信息获取或者操作部分的shell命令是无法执行的这种命令既不报错也不会返回信息。2.函数1.概况autojs给出了两种执行shell命令的方式第一种是直接调用shell函数另一种是构建一个Shell对象再调用对象的函数。我们使用第一种方式时一般会以root权限的方式运行这种方式每次都会自动创建个shell对象运行方式采用同步运行执行速度相对较慢但是权限较高我们使用第二种方式时会先手动创建个包含root权限的shell对象然后调用这个对象的函数来执行shelll命令我们在整个代码可以创建一个shell对象运行方式采用异步运行这种方式执行速度相对较快但是权限较低。一般情况下我们可以在代码开始构建一个shell对象然后通过这个对象来执行命令当shell对象由于权限不够而无法使命令生效时再通过直接调用shell函数的方式执行。但是下面的使用场景中也介绍了两种方式的使用情况可以按照这个使用场景进行使用。2.shell函数用于执行shell命令需要传递两个参数分别为命令和是否以root权限运行默认为false参数类型分别为字符串和boolean返回执行结果返回类型为对象。执行结果对象属性有code、result和error分别表示返回码、运行结果和运行错误信息。其中code为0时表示运行成功不为0时代表运行失败。以“adb shell pm list packages”命令为例怎么在autojs中执行这个命令。我前面介绍了很多关于root权限才能使用的函数我的autojs早已经获取了root权限忽略了这个情况。我下面代码会把我认为比较好用获取root权限方式告诉大家。如果使用root权限的功能获取root权限代码一般放在脚本开头。但是学习阶段防止代码干扰之后不再介绍获取root权限的功能。这是电脑cmd中调用adb shell命令查看雷电模拟器应用信息的情况大家会发现每次执行abd shell命令都会重启adb因为我电脑上拥有adb的应用Android Studio、按键精灵手机助手、雷电模拟器4、雷电模拟器9太多了出现这种情况主要是abd版本冲突导致的。幸好不影响功能我这里就处理了大家知道就好了。在autojs可以通过以下方式获取root权限和执行shell命令。// 获取root权限 if (!hasRootAccess()) { toast(请开启Root权限); // 如果请求root权限失败 if (!requestRoot()) { // 清理缓存退出脚本 // 由于这是学习阶段没有缓存就直接退出了 exit(); } } let result shell(pm list packages, true); // 如果执行成功 if (result.code 0) { console.log(执行shell命令成功); console.log(result.result); } else { console.log(执行shell命令失败); console.log(result.error); } // 检查是否有Root权限 function hasRootAccess() { let result shell(id, true).result; // 执行Linux系统命令 return (result.indexOf(uid0) 0); // uid0表示Root用户 } // 请求Root权限 function requestRoot() { let sh new Shell(true); // 创建交互式Shell sh.exec(su); // 发送Root权限请求 // 等待用户手动授权弹出系统授权弹窗 sleep(5000); // 留出5秒操作时间 if (hasRootAccess()) { toast(Root权限已获取); return true; } else { toast(Root权限请求失败); return false; } }3.Shell对象Shell对象构造函数允许传递一个是否以root权限运行默认为false一个参数参数类型为boolean我们一般会以root权限创建对象返回shell对象。返回shell对象的函数有exec、exit、exitAndWaitFor和setCallback分别用于执行shell命令、退出shell命令、等待命令运行结束和运行回调。exec函数用于执行shell命令需要传递命令一个参数参数类型为字符串这个函数无返回值如果想获取返回数据需要通过setCallback回调函数。exit函数用于退出命令运行正在运行的命令也会终止一般出现特殊情况下才会调用这个函数正常结束的函数可以不调用这个函数。exitAndWaitFor函数用于等待命令运行结束通过exec函数运行方式是异步运行的需要调用这个函数保证命令执行完成避免后面代码提前运行而导致出错。setCallback函数用于获取运行过程中的数据包含onOutput和onNewLine两个函数onOutput函数每次返回数据加载完成都会调用一次onNewLine函数每次返回数据加载一行都会调用一次。实际上通过回调的方式获取返回数据非常不友好会包含大量干扰信息最终导致onOutput函数会获取各种空信息和结束信息以及onNewLine函数获取多行数据才调用一次和获取onOutput函数类似的无用信息。let currentShell new Shell(true); // 执行shell命令 currentShell.exec(pm list packages); // 保存通过新行拼接的字符串 let lineString; // 保存通过新内容拼接的字符串 let contentString; // 执行回调函数 currentShell.setCallback({ onNewLine: function (line) { console.log(新行 line); }, onOutput: function (content) { console.log(新内容 content); } }) // 等待命令运行结束 currentShell.exitAndWaitFor(); // 退出命令行 currentShell.exit();4.使用场景通过上面的比较可以发现Shell对象执行命令的方式局限性还是很大的但是这种能够共用一个对象执行速度快也是一个优点。我给出几个常用的场景如果想快速执行shell命令并且能够保证命令成功执行可以使用Shell对象的方式如果需要获取返回信息无法保证执行命令的正确性或者需要很高的执行权限可以使用shell函数的方式。3.命令官方文档介绍了很多命令我就不一一介绍了。这些命令并不是包含所有adb shell命令而且找起来很不方便。一般我需要哪个功能的adb shell就会通过AI搜索一下然后通过autojs使用。这些命令不如函数一样方便查找可以通过用到啥搜索啥的方式然后直接使用和调试。我目前没有遇到命令不能执行的情况除了查询和操作内存信息的时候。我们一般情况下很少使用adb shell的方式完成某个功能当我们有特殊需求时可以使用。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门