回答
自动化脚本编写指南
一、初始化配置
// 文档地址 https://docs.hamibot.com/
// 初始化RootAutomator(需root权限)
var ra = new RootAutomator();
events.on('exit', function() {
ra.exit();
});
// 配置日志文件(记录操作时间、状态)
var logFile = files.open("/sdcard/automation_log.txt", "a");
function log(msg) {
var time = new Date().toLocaleString();
logFile.write(time + " - " + msg + "\n");
logFile.flush();
}
二、核心操作函数
1. 坐标操作
// 单点点击(推荐使用RootAutomator)
ra.tap(500, 1000); // 点击(500,1000)坐标
// 滑动操作
Swipe(100, 1000, 800, 1000, 500); // 从(100,1000)到(800,1000)滑动,持续500ms
// 复杂手势(需精确坐标)
gesture(1000, [0, 0], [500, 500], [500, 1000]); // 2秒手势路径
2. 应用管理
// 关闭指定应用(示例来自文档4)
function closeApp(appName) {
var name = getPackageName(appName);
if (!name && getAppName(appName)) name = appName;
if (!name) return false;
app.openAppSetting(name);
text(app.getAppName(name)).waitFor();
sleep(500);
let forceStop = textMatches(/(.*强.*|.*停.*|.*结.*)/).findOne();
if(forceStop.enabled()) {
forceStop.parent().click();
textMatches(/(.*确.*|.*定.*)/).findOne().click();
log(app.getAppName(name) + " 已关闭");
sleep(1000);
back();
}
}
3. 控件操作
// 精准控件匹配
var target = text("立即领取").depth(12).findOne(3000);
if(target) {
click(target.bounds().centerX(), target.bounds().centerY());
} else {
log("控件未找到");
}
三、开发规范
1. 坐标获取方法
- 开启开发者选项 → 指针位置(显示实时坐标)
- 使用截屏工具测量相对坐标
- 多分辨率适配:使用
device.width
和device.height
计算比例坐标
2. 异常处理机制
// 全局异常捕获
try {
// 核心操作逻辑
} catch(e) {
log("错误: " + e.message);
toast("脚本异常中断,请检查设备状态");
}
// 超时控制
var timeout = 10000; // 10秒超时
var startTime = new Date().getTime();
while(!text("预期文本").exists()) {
if(new Date().getTime() - startTime > timeout) {
log("等待超时");
break;
}
sleep(500);
}
四、注意事项
1. 权限要求
- 必须开启无障碍服务权限
- Root权限需求(坐标操作需root)
- 显示悬浮窗权限(部分设备需要)
2. 操作规范
- 每个动作后建议添加
sleep(500)
防止操作过快 - 多点触摸使用不同ID区分:
ra.tap(300, 1000, 1); // 手指1 ra.tap(700, 1000, 2); // 手指2
- 避免连续快速操作(防止动作队列堆积)
3. 设备差异
- 不同系统UI层级不同(需要调整控件选择策略)
- 分辨率差异处理:
var scale = device.width / 1080; // 以1080p为基准 var adjustedX = Math.round(500 * scale);
- 厂商定制系统(如MIUI需要手动开启"显示悬浮窗")
4. 调试技巧
- 使用
toast()
实时显示调试信息
ℹ️ 本回答由 AI 生成,内容仅供参考