如何执行adb命令

已存档
nnhu4rqy42 · 29 天前
第 1 条补充
·
29 天前

var result = shell("adb exec-out screencap -p > screenshot.png", true);
log(result);

怎么执行不了

第 2 条补充
·
29 天前

文件
test
index.js
配置模式
编辑器选项

1
log('-----开始执行-----');
2

3
// 执行ADB命令
4
var result = shell('screencap /sdcard/Download/screenshot.png', true);
5
if (result.code == 0) {
6
toast('截图保存成功');
7
} else {
8
toast('截图失败: ' + result.error);
9
}
10

11

12
log('------------');
13
sleep(2000);
14
toastLog("✅ 脚本已全部执行完!!!");
15
hamibot.exit();

没有看到截图,看日志就打印了-----开始执行-----

回答

Hamibot AI
1
· 29 天前

在 Hamibot 中,你可以使用 shell() 函数或 Shell 对象来执行 adb 命令。

使用 shell() 函数

// 文档地址 https://docs.hamibot.com/
var result = shell('你的adb命令', true);  // 第二个参数 true 表示使用 root 权限
log(result);

使用 Shell 对象(适合执行多个命令)

// 文档地址 https://docs.hamibot.com/
var sh = new Shell(true);  // true 表示使用 root 权限
sh.exec('你的第一个命令');
sh.exec('你的第二个命令');
sh.exit();  // 记得最后关闭 shell

示例:强制停止微信应用

// 文档地址 https://docs.hamibot.com/
var result = shell('am force-stop com.tencent.mm', true);
if (result.code == 0) {
    toast('执行成功');
} else {
    toast('执行失败,错误信息:' + result.error);
}

注意:

  • 需要 root 权限的命令要设置第二个参数为 true
  • 命令格式与 adb shell 命令完全相同
  • 可以通过返回对象的 coderesulterror 属性获取执行结果

补充回答 1

你的代码执行不了是因为在 Hamibot 中,shell() 函数用于在设备上执行 shell 命令(类似于 adb shell <command>),而不是执行本地的 adb 命令。你使用的命令 adb exec-out screencap -p > screenshot.png 是 adb 客户端命令,需要在计算机上运行,但 Hamibot 脚本运行在设备上,无法直接调用 adb。

解决方案:

  1. 使用设备上的 screencap 命令:直接在设备 shell 中执行截图命令,并保存到设备存储中。

    // 文档地址 https://docs.hamibot.com/
    var result = shell('screencap /sdcard/screenshot.png', true);
    if (result.code == 0) {
        toast('截图保存成功');
    } else {
        toast('截图失败: ' + result.error);
    }
    

    这会将截图保存到设备的 /sdcard/screenshot.png

  2. 使用 Hamibot 内置的 captureScreen() 函数:这是更推荐的方式,因为它更稳定且易于使用。

    // 文档地址 https://docs.hamibot.com/
    // 首先请求截图权限
    if (!requestScreenCapture()) {
        toast('没有截图权限');
        hamibot.exit();
    }
    // 截取屏幕并保存
    captureScreen('/sdcard/screenshot.png');
    toast('截图保存成功');
    

为什么你的命令失败?

  • adb exec-out 是 adb 命令,只能在计算机上运行,设备 shell 无法识别它。
  • 重定向 >shell() 函数中不会将输出保存到文件,而是被捕获到 result.result 字符串中,但截图是二进制数据,不适合用字符串处理。

建议使用上述方法之一来执行截图操作。如果还有其他问题,请提供更多细节。


补充回答 2

你的脚本执行后只打印了“-----开始执行-----”,但没有截图,可能是因为 shell 命令执行失败或设备没有 root 权限。在 Hamibot 中,使用 shell 命令进行截图需要设备已 root 且 Hamibot 具有 root 权限,否则命令会失败。

可能的原因和解决方案:

  1. 设备没有 root 权限shell 命令的第二个参数 true 要求 root 权限。如果设备未 root 或 Hamibot 未获得 root 授权,命令会返回非零错误码。

    • 检查设备是否已 root,并确保 Hamibot 被授予 root 权限。
    • 你可以通过日志输出 result.error 来查看具体错误信息(但你的脚本中已经做了这个检查,但可能由于命令失败导致脚本提前终止)。
  2. 路径问题/sdcard/Download/ 目录可能不存在或没有写权限。尝试使用更通用的路径,如 /sdcard/

  3. 命令执行超时或挂起screencap 命令有时可能因系统原因挂起,导致脚本卡住。但根据你的代码,shell 是同步的,所以如果命令失败,它会返回错误。

推荐使用 Hamibot 内置截图功能:

内置的 captureScreen() 函数更稳定,不需要 root 权限,只需要请求截图权限。修改你的脚本如下:

// 文档地址 https://docs.hamibot.com/
log('-----开始执行-----');

// 请求截图权限
if (!requestScreenCapture()) {
    toast('没有授予 Hamibot 屏幕截图权限');
    hamibot.exit();
}

// 使用内置函数截图并保存
var screenshotPath = '/sdcard/Download/screenshot.png';
captureScreen(screenshotPath);
toast('截图保存成功: ' + screenshotPath);

log('------------');
sleep(2000);
toastLog("✅ 脚本已全部执行完!!!");
hamibot.exit();

如果你仍想使用 shell 命令,添加详细日志调试:

// 文档地址 https://docs.hamibot.com/
log('-----开始执行-----');

// 执行 ADB 命令,并添加日志输出
var result = shell('screencap /sdcard/Download/screenshot.png', true);
log('命令执行结果: ' + JSON.stringify(result)); // 输出完整结果对象

if (result.code == 0) {
    toast('截图保存成功');
} else {
    toast('截图失败: ' + result.error);
    log('错误详情: ' + result.error);
}

log('------------');
sleep(2000);
toastLog("✅ 脚本已全部执行完!!!");
hamibot.exit();

运行这个版本,查看日志中的 result 对象,可以确定命令是否失败以及错误原因。如果 result.code 不是 0,错误信息会提示具体问题(如权限不足或命令不存在)。

尝试这些修改,应该能解决问题。如果仍有疑问,提供更多日志细节,我可以进一步帮助。

ℹ️ 本回答由 AI 生成,内容仅供参考