hamibot能否用rish_shizuku.dex进行adb的操作?有没有代码例子?
如何判断某个软件是否安装,如果安装就显示已安装,如果未安装就下载并进行安装。代码怎么写?
知道app安装包路径,如何写一个代码,让他弹出该安装包的安装界面?
回答
Hamibot 脚本运行环境基于 Rhino JavaScript 引擎,不支持直接加载或使用外部的 .dex 文件(如 rish_shizuku.dex)。这种机制是为了保证脚本运行的安全性和稳定性。
如果你希望执行 ADB 相关的 Shell 命令,Hamibot 提供了原生的 shell() 方法。你可以利用该方法在设备上执行系统指令。
下面是符合 Rhino 1.7.15 兼容性的代码示例:
// 文档地址 https://docs.hamibot.com/
// 模拟屏幕点击
shell("input tap 500 1000");
// 获取已安装的应用包名
var output = shell("pm list packages");
print(output);
注意事项:
- 脚本中请勿使用箭头函数、默认参数值等 ES6+ 特性,以免报错。
- 执行 shell 命令前,请确保 Hamibot 已获得足够的系统权限。
- 复杂操作建议优先使用 Hamibot 提供的自动化 API(如 click(), toast() 等),它们比直接调用 shell 更稳定且易于维护。
Hamibot 可以通过 Shell 命令检测应用安装状态,并结合 HTTP 请求下载 APK 文件,最后调用系统安装指令。需要注意的是,由于 Android 系统的安全限制,非 Root 环境下自动安装通常需要用户手动确认权限。
以下是一个兼容 Rhino 1.7.15 引擎的代码示例:
// 文档地址 https://docs.hamibot.com/
var packageName = "com.example.app"; // 替换为目标应用的包名
var apkUrl = "https://example.com/app.apk"; // 替换为实际的 APK 下载地址
var savePath = "/sdcard/Download/" + packageName + ".apk";
// 检查是否已安装
function checkInstalled(pkg) {
var result = shell("pm list packages " + pkg);
return result.indexOf(pkg) > -1;
}
// 下载文件
function downloadFile(url, path) {
var res = http.get(url);
if (res.statusCode == 200) {
var bytes = res.body.bytes();
files.writeBytes(path, bytes);
return true;
}
return false;
}
// 主逻辑
if (checkInstalled(packageName)) {
toastLog("已安装");
} else {
toastLog("未安装,开始下载...");
if (downloadFile(apkUrl, savePath)) {
toastLog("下载完成,开始安装...");
// -r 表示覆盖安装,保留数据;-g 授予所有权限
var installResult = shell("pm install -r -g " + savePath);
if (installResult.indexOf("Success") > -1 || installResult.indexOf("success") > -1) {
toastLog("安装成功");
} else {
toastLog("安装失败,请检查权限或手动安装");
}
} else {
toastLog("下载失败");
}
}
关键注意事项:
- 兼容性:代码中未使用箭头函数和默认参数,确保在 Hamibot 的 Rhino 环境中正常运行。
- 安装权限:从 Android 8.0 开始,系统禁止静默安装未知来源应用。脚本执行
pm install时可能会弹出系统确认框,需要用户手动点击“允许”或“安装”。如果设备已 Root 或通过 Shizuku 授权,可能实现更高级别的控制。 - 存储权限:脚本需要获得存储读写权限才能将 APK 保存到
/sdcard/目录。 - 网络环境:确保设备连接网络,且下载链接有效。
- 安全性:请确保下载的 APK 来源可靠,避免引入恶意软件。
建议在实际使用前,先在测试设备上验证下载路径和安装指令的有效性。
在 Hamibot 中,如果你已知 APK 文件的绝对路径,可以通过 Shell 命令调用系统的 Activity Manager (am) 来启动安装界面。这比直接调用 pm install 更友好,因为它会弹出标准的系统安装确认页面。
以下是兼容 Rhino 1.7.15 引擎的代码示例:
// 文档地址 https://docs.hamibot.com/
var apkPath = "/sdcard/Download/example.apk"; // 替换为你的 APK 文件绝对路径
// 构建启动安装界面的 Intent 命令
// -a android.intent.action.VIEW : 设置动作为查看
// -d : 设置数据 URI,注意需要加上 file:// 前缀
// -t application/vnd.android.package-archive : 设置 MIME 类型为安装包
var cmd = 'am start -a android.intent.action.VIEW -d "file://' + apkPath + '" -t application/vnd.android.package-archive';
// 执行命令
shell(cmd);
toastLog("正在尝试打开安装界面...");
关键注意事项:
- 路径格式:确保
apkPath是完整的绝对路径(例如/sdcard/Download/app.apk),相对路径可能无法识别。 - 权限要求:
- 脚本需要拥有 Shell 权限。
- 设备需要在“设置 -> 安全”中开启 “未知来源应用安装” 权限,允许 Hamibot 或当前触发安装的应用进行安装操作。
- 从 Android 8.0 开始,如果通过非系统应用安装,可能需要用户在弹出的系统对话框中手动点击“允许”。
- URI 协议:代码中使用了
file://协议。在某些高版本 Android 系统中,如果权限配置严格,可能需要使用content://协议,但在大多数自动化场景下file://配合 Shell 命令通常有效。 - 兼容性:代码未使用箭头函数或默认参数,确保在 Hamibot 的 JavaScript 环境中稳定运行。
如果上述方法因系统限制无效,你可以尝试直接使用 app.openUrl("file://" + apkPath),但这取决于系统对文件协议的默认处理行为。