尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于AutoJS的Android自动化脚本开发:从原理到实战

基于AutoJS的Android自动化脚本开发:从原理到实战 1. 项目概述一个能解放双手的自动化利器最近在折腾一些重复性的手机操作时发现了一个宝藏级的开源项目——Alipay AutoJS。这名字乍一看可能让人联想到支付宝但实际上它是一个基于Android平台的、功能强大的JavaScript自动化脚本工具。简单来说它允许你通过编写JavaScript脚本来模拟手指在手机屏幕上的点击、滑动、输入等操作从而实现一系列任务的自动化。想象一下每天需要定时打卡、批量处理消息、自动收集某些应用的能量或金币这些枯燥重复的操作如果能让手机自己完成岂不是美滋滋这正是AutoJS的核心价值所在。我之所以称它为“宝藏”是因为它完全免费、开源并且拥有一个极其活跃的社区。这意味着你不仅能免费使用所有功能还能从社区获得海量的现成脚本和学习资源。对于有一定编程基础尤其是前端开发的朋友来说上手会非常快对于新手它友好的图形化操作和丰富的示例也能让你快速入门。无论是想提升工作效率、研究自动化技术还是单纯想“偷个懒”这个工具都值得你深入了解。2. 核心原理与架构拆解它如何让手机“自己动起来”要理解AutoJS如何工作我们需要深入到它的技术内核。本质上它构建了一个在Android系统上运行的JavaScript运行时环境。2.1 核心引擎Rhino与无障碍服务AutoJS的核心脚本引擎是Mozilla Rhino这是一个用Java编写的JavaScript引擎。这意味着你在AutoJS中编写的JS代码最终是由这个引擎在Java虚拟机JVM环境中解释执行的。Rhino提供了完整的ES5支持并允许JS代码与Java对象进行无缝交互这是实现系统级操作的关键。而实现自动化操作的“手”和“眼睛”则依赖于Android系统的无障碍服务AccessibilityService。这是一个Android官方提供的、旨在帮助残障人士使用手机的特殊功能。AutoJS通过申请并启用无障碍服务权限获得了极高的系统权限可以读取屏幕内容获取当前界面上的控件信息如文本、ID、坐标。模拟用户操作执行点击、长按、滑动、输入文本等操作。监听界面变化感知Activity切换、窗口更新等事件。这种结合方式非常巧妙Rhino引擎提供了灵活强大的编程能力而无障碍服务则提供了与系统交互的合法通道。你写的JS脚本通过调用AutoJS封装好的API最终转化为一系列通过无障碍服务发送的系统指令从而操控手机。2.2 关键组件与工作流一个典型的AutoJS脚本工作流涉及以下几个关键组件脚本引擎解析和执行你的JavaScript代码。无障碍服务作为与系统UI交互的桥梁。控件选择器这是AutoJS的精华之一。它允许你通过类似CSS选择器或条件判断的方式精准定位屏幕上的UI元素。例如通过text(“确定”).click()来点击一个文本为“确定”的按钮。图像识别模块对于某些无法通过控件信息定位的元素比如游戏中的图标AutoJS提供了基于OpenCV的图像识别功能允许你通过找图、找色来定位并操作。定时任务与事件监听可以设置脚本在特定时间、日期运行或者监听通知、按键、屏幕点亮等事件来触发脚本。整个工作流程可以概括为编写脚本 - 选择器/图像识别定位目标 - 通过无障碍API执行操作 - 循环或条件判断直至任务完成。这种模式将复杂的自动化任务分解为一系列可编程的步骤赋予了用户极大的灵活性。注意正因为依赖无障碍服务AutoJS需要你手动在系统的“无障碍设置”中开启对应权限。不同手机品牌该设置的路径略有不同通常在“设置-更多设置-无障碍”或“设置-辅助功能”中。开启后AutoJS才能正常“看到”和“操作”你的屏幕。3. 环境搭建与基础实操从零到第一个脚本理论说得再多不如动手一试。下面我将带你完成从安装到运行第一个自动化脚本的全过程。3.1 软件安装与权限配置首先你需要获取AutoJS的安装包。由于开源版本已不在主流应用商店上架我们需要从可靠的渠道获取。获取APK访问项目的GitHub仓库发布页或从其官方文档推荐的镜像站下载最新稳定版的APK文件。务必核对文件哈希值确保安全。安装与基础权限安装APK后打开应用它会引导你开启一系列必要权限悬浮窗权限用于显示脚本运行状态、日志和控制台。无障碍服务权限如前所述这是核心权限。进入系统设置找到AutoJS并开启。后台弹出界面权限防止脚本运行时被系统省电策略杀死。电池优化白名单同样是为了保证脚本能在后台持续运行。这些权限是AutoJS工作的基石缺一不可。开启后你会在AutoJS主界面看到“无障碍服务已开启”的提示。3.2 编写与运行你的第一个脚本AutoJS提供了内置的编辑器我们可以直接在里面编写代码。让我们从一个最简单的“Hello World”式脚本开始——自动打开微信并搜索某个公众号。打开AutoJS点击右下角的“”号新建一个脚本文件命名为first_script.js。// 3.2.1 唤醒设备并解锁屏幕假设已设置免密解锁或已知密码 device.wakeUp(); // 唤醒屏幕 sleep(500); // 等待500毫秒确保屏幕亮起 // 如果有锁屏密码这里可以加入滑动解锁或密码输入代码但涉及隐私本例假设无密码 // 3.2.2 启动微信 launchApp(微信); console.log(正在启动微信...); sleep(3000); // 等待3秒让微信完全启动 // 3.2.3 点击微信顶部的搜索框 // 这里使用选择器定位搜索框。不同微信版本控件可能不同这是一个常见写法。 let searchBox className(EditText).findOne(5000); // 等待5秒内找到第一个编辑框控件 if (searchBox) { searchBox.click(); // 点击搜索框 sleep(1000); // 3.2.4 输入搜索内容 setText(AutoJS学习); // 输入文本 sleep(1500); // 3.2.5 点击键盘上的搜索键回车 KeyCode(KEYCODE_ENTER); // 模拟按下回车键 console.log(搜索指令已发送); } else { console.error(未找到搜索框请检查微信界面或选择器); } // 3.2.6 脚本结束提示 toast(脚本执行完毕); console.log(脚本运行结束);代码解析与实操要点device.wakeUp()和launchApp()是AutoJS提供的全局函数用于基础设备控制和应用启动。className(“EditText”).findOne(5000)是控件选择器的典型用法。它寻找类名为EditTextAndroid中文本框的通用类的控件并等待最多5秒。findOne()返回找到的第一个控件对象。setText()可以直接向当前焦点输入框输入文字比模拟键盘输入更稳定。KeyCode()用于模拟物理按键KEYCODE_ENTER代表回车键。sleep(ms)函数至关重要它让脚本暂停指定毫秒数等待界面响应。时间设置太短可能导致操作失败太长则降低效率需要根据实际情况调整。console.log()和toast()用于输出日志和屏幕提示是调试脚本的好帮手。写好脚本后点击编辑器右上角的“保存”图标然后点击三角形“运行”按钮。如果一切配置正确你将看到手机自动亮屏、打开微信、点击搜索框并输入文字。实操心得第一个脚本失败率很高这非常正常最常见的原因是sleep时间不足或者控件选择器没写对。AutoJS提供了一个“布局范围分析”功能通常在悬浮窗菜单或应用主界面可以实时查看当前屏幕的控件层次结构是编写和调试选择器的神器。多使用console.log输出中间状态是快速定位问题的好习惯。4. 核心技能进阶选择器、图像识别与定时任务成功运行第一个脚本后你已经入门了。但要处理更复杂的场景必须掌握以下三大核心技能。4.1 精通控件选择器精准定位的钥匙控件选择器是AutoJS脚本稳定性的关键。除了上面用到的className还有多种定位方式// 1. 通过文本定位 text(“登录”).click(); // 点击文字为“登录”的控件 textContains(“确认”).findOne().click(); // 点击包含“确认”文字的控件 // 2. 通过控件ID定位最稳定如果开发者给控件设了id id(“btn_submit”).findOne().click(); // 3. 通过描述内容定位常用于无障碍提示 desc(“关闭按钮”).click(); // 4. 组合条件定位 className(“Button”).text(“确定”).clickable(true).findOne().click(); // 含义找一个类名为Button文本是“确定”并且可点击的控件然后点击它。 // 5. 相对定位和兄弟节点定位 let parent className(“LinearLayout”).findOne(); let child parent.findOne(text(“选项A”)); child.click(); // 6. 等待控件出现比固定sleep更智能 auto.waitFor(); // 等待无障碍服务稳定 let okBtn text(“OK”).waitFor(); // 等待“OK”按钮出现最多等待10秒默认 okBtn.click();选择器策略建议优先级idtext/descclassName。ID是唯一且最稳定的但很多应用控件ID是随机或空的。多用waitFor()代替固定的sleep可以大幅提高脚本效率和稳定性。善用控制台和布局分析在写复杂选择器时先用布局分析查看目标控件的所有属性再选取最具辨识度的组合。4.2 图像识别应对游戏与复杂界面的法宝当应用界面是游戏画面或者控件信息无法获取时例如某些Flutter或Unity应用图像识别就成了唯一的选择。AutoJS内置了images模块。// 4.2.1 找图在屏幕上寻找一张预先保存的图片 let targetImg images.read(“/sdcard/Pictures/wechat_search.png”); // 读取图片文件 let result findImage(captureScreen(), targetImg, { threshold: 0.8 // 相似度阈值0-1越高越严格 }); if (result) { click(result.x, result.y); // 点击找到的图片中心坐标 } else { console.error(“未找到目标图片”); } // 4.2.2 找色判断特定位置的颜色是否符合预期 if (images.detectsColor(captureScreen(), “#FF0000”, 100, 200)) { // 如果屏幕坐标(100, 200)的颜色是红色#FF0000 console.log(“红色按钮已出现”); click(100, 200); }图像识别注意事项图片素材截取目标图片时要保证清晰、特征明显且尺寸不宜过大。性能消耗全屏找图比较耗CPU尽量缩小查找区域images.clip。适配多分辨率在不同分辨率的设备上运行时图片坐标和尺寸会变。解决方案是使用相对坐标基于屏幕宽高百分比或多点比色或者准备多套分辨率对应的图片素材。阈值调整threshold参数需要根据实际情况微调太高找不到太低容易误点。4.3 定时任务与后台运行实现全天候自动化AutoJS的脚本不仅可以手动运行更可以设置为定时任务或事件触发实现真正的自动化。定时任务在脚本开头加入特定注释AutoJS的“定时任务”功能就能识别。/** * description 每日签到脚本 * cron 10 9 * * * * only */ // 脚本内容... 每天上午9:10运行cron表达式遵循Cron语法非常灵活。设置好后在AutoJS的“定时任务”界面启用即可。后台运行与保活长时间运行的脚本如监控类需要避免被系统清理。在AutoJS的设置中开启“稳定模式”或“前台服务”。在脚本中可以定期执行一个轻微操作如振动一下device.vibrate(10)或输出日志告诉系统这个应用还在活跃状态。将AutoJS加入手机系统的“自启动”和“电池优化忽略”名单。事件监听// 监听按键事件例如按下音量下键时执行任务 events.observeKey(); events.onKeyDown(“volume_down”, function(event){ console.log(“音量下键被按下开始执行任务...”); // 执行你的任务代码 });5. 复杂项目实战编写一个全自动每日签到脚本现在我们综合运用以上知识来设计一个相对复杂的实战项目一个全自动的每日签到脚本它需要处理多个应用并能应对网络延迟、弹窗等异常情况。项目目标每天上午8点自动依次完成“应用A”、“应用B”的签到任务并截图保存签到结果。5.1 脚本架构设计一个好的脚本应该有清晰的逻辑结构和健壮的容错机制。我们采用模块化思路/** * description 全自动每日签到脚本 * cron 0 8 * * * */ // 全局配置 const APPS [ { name: “应用A”, packageName: “com.example.app_a”, signInText: “每日签到” }, { name: “应用B”, packageName: “com.example.app_b”, signInText: “签到” } ]; const SCREENSHOT_PATH “/sdcard/Documents/SignInScreenshots/”; // 工具函数 // 函数1安全点击函数增加重试机制 function safeClick(selector, maxRetry 3) { for (let i 0; i maxRetry; i) { let target selector.findOne(2000); // 每次等待2秒 if (target) { target.click(); sleep(1500); // 点击后等待界面响应 return true; } console.warn(第${i1}次尝试点击失败选择器${selector}); sleep(1000); } console.error(点击失败选择器${selector}); return false; } // 函数2处理可能的弹窗如权限申请、广告 function dismissPopups() { // 尝试查找并点击常见的“关闭”、“跳过”、“知道了”按钮 let closeButtons [“关闭”, “跳过”, “知道了”, “取消”, “以后再说”]; for (let btnText of closeButtons) { let btn text(btnText).findOne(500); if (btn) { btn.click(); console.log(已关闭弹窗${btnText}); sleep(800); return true; } } return false; } // 主签到函数 function signInApp(appInfo) { console.log(开始处理${appInfo.name}); // 启动应用 launch(appInfo.packageName); sleep(4000); // 等待应用启动 // 循环处理弹窗最多处理5次 for (let j 0; j 5; j) { if (!dismissPopups()) { break; // 没有弹窗了跳出循环 } } // 尝试寻找并点击签到按钮 let signInSuccess false; let signInSelector text(appInfo.signInText).clickable(true); if (safeClick(signInSelector)) { sleep(2000); // 等待签到结果页面 // 签到后通常会出现“签到成功”、“已签到”等提示 if (textMatches(/签到成功|已签到|获得.*金币/).findOne(3000)) { console.log(√ ${appInfo.name} 签到成功); signInSuccess true; } } else { console.log(- ${appInfo.name} 可能已签到或未找到按钮); // 也可能按钮文字变了可以尝试其他选择器这里省略... } // 截图保存结果 let timestamp new Date().getTime(); let screenshotFile ${SCREENSHOT_PATH}${appInfo.name}_${timestamp}.png; if (captureScreen(screenshotFile)) { console.log(截图已保存${screenshotFile}); } // 返回桌面准备下一个应用 home(); sleep(2000); return signInSuccess; } // 脚本主流程 console.show(); // 显示悬浮日志窗口 toast(“每日签到任务开始执行”); // 创建截图目录 files.createWithDirs(SCREENSHOT_PATH); let successCount 0; for (let app of APPS) { if (signInApp(app)) { successCount; } sleep(3000); // 应用间间隔 } // 任务完成汇总 let msg 签到任务完成。成功${successCount}/${APPS.length}; toast(msg); console.log(msg); device.cancelKeepingAwake(); // 取消保持唤醒 console.hide(); // 隐藏日志窗口5.2 脚本优化与调试心得这个脚本已经具备了生产环境使用的雏形但在实际部署前还需要考虑以下几点网络状态检查在任务开始前可以加入检查Wi-Fi或移动网络是否连接的逻辑。if (!device.isWifiConnected() !device.isMobileDataConnected()) { toast(“无网络连接任务终止”); exit(); }更智能的等待用waitFor()代替部分固定的sleep可以加快脚本速度。// 等待“签到成功”提示出现最多等5秒 textMatches(/签到成功/).waitFor();日志与通知将重要的成功/失败信息通过notice模块发送到系统通知栏甚至可以通过HTTP请求通知到自己的服务器或钉钉/微信机器人。异常捕获使用try...catch包裹可能出错的部分防止单个应用失败导致整个脚本崩溃。try { signInApp(app); } catch (e) { console.error(处理${app.name}时发生错误, e); // 记录错误继续执行下一个应用 }6. 常见问题排查与安全使用指南即使脚本写得再完善在实际运行中也会遇到各种“坑”。下面是我总结的一些典型问题及解决方案。6.1 脚本运行类问题问题现象可能原因排查与解决思路脚本一闪而过无任何效果1. 无障碍服务未开启。2. 悬浮窗权限未开启。3. 脚本有语法错误立即退出。1. 检查系统设置中AutoJS的无障碍服务开关。2. 检查AutoJS的悬浮窗权限。3. 在AutoJS的“日志”界面查看运行报错信息。点击位置不对或没反应1. 控件选择器写错定位不到元素。2.sleep时间太短界面未加载完。3. 屏幕分辨率适配问题。1. 使用“布局范围分析”工具确认控件属性。2. 适当增加关键操作后的sleep时间或用waitFor()。3. 使用相对坐标或基于屏幕比例的坐标。定时任务不执行1. 手机休眠或杀死了AutoJS后台进程。2. Cron表达式写错。3. 系统省电策略限制。1. 将AutoJS加入后台白名单、自启动名单关闭电池优化。2. 在线检查Cron表达式是否正确。3. 在脚本开头加入device.keepScreenOn()临时保持亮屏。图像识别找不到图1. 图片素材与屏幕当前内容不符UI更新。2. 相似度阈值threshold设置过高。3. 查找区域region设置不对。1. 重新截取目标图片。2. 逐步调低threshold如从0.9调到0.7测试。3. 指定更精确的查找区域减少干扰。6.2 安全与合规使用守则这是最重要的一部分请务必遵守仅用于个人学习与合法自动化AutoJS是一个强大的工具务必用于处理个人、合法的重复性任务。绝对禁止用于游戏外挂、破解、刷榜等破坏游戏公平的行为。恶意刷单、刷流量、爬取受法律保护或违反Robots协议的数据。任何干扰、攻击他人服务或系统的行为。尊重应用开发者过度频繁的自动化操作可能对应用服务器造成压力触发反爬虫机制导致账号被封。请在脚本中合理设置延迟sleep模拟真人操作间隔。注意个人信息安全脚本中不要硬编码你的账号、密码等敏感信息。如果需要使用AutoJS提供的storage模块进行本地加密存储或通过二次确认的方式输入。谨慎使用社区脚本开源社区有很多共享脚本在导入运行前一定要仔细阅读代码理解其每一步操作避免运行恶意脚本造成财产损失或隐私泄露。了解风险使用自动化脚本本身可能违反某些应用或服务的用户协议。用于核心业务或重要账号前请自行评估风险。6.3 性能优化小技巧减少不必要的截图和找图captureScreen()和图像识别非常耗资源只在必要时使用。使用选择器代替图像识别只要能用控件选择器定位就优先用选择器效率高且更稳定。合理规划等待时间在网络请求或页面跳转后适当增加sleep但非必要处尽量减少用waitFor()进行条件等待。脚本模块化将通用功能如登录、处理弹窗写成函数方便维护和复用也减少代码冗余。从简单的模拟点击到复杂的多应用调度AutoJS为我们打开了一扇自动化的大门。它的核心魅力在于将编程能力直接转化为生产力让繁琐的操作变得优雅简单。我个人的体会是学习AutoJS的过程不仅是学习一个工具更是在训练一种将重复性工作抽象化、流程化的思维。最开始可能会在控件定位、延时等待上踩不少坑但每解决一个问题你对应用交互逻辑的理解就会深一层。最后分享一个小心得写脚本时不妨把自己想象成一个第一次使用这个应用的、有点笨拙但非常耐心的用户然后一步步教手机如何操作这样的脚本往往更健壮。
返回列表