1. 先弄明白 Auto.js 是个什么东西
1.1 它到底能帮你干什么
Auto.js 说白了就是一个跑在安卓手机上的 JavaScript 自动化脚本工具。你用 JavaScript 写一段逻辑,它就能帮你自动操作手机:自动点击、自动滑动、自动输入文字、自动读取通知栏消息、自动切换应用,甚至定时定点执行任务。
我最早接触它是因为工作需要每天重复"打开 App → 点某个按钮 → 截图 → 退出"这一套流程,一天几十次,整个人都会被搞麻。后来花了一晚上把 Auto.js 跑通,第二天上班直接让手机自己干活,我只需要偶尔瞄一眼有没有跑偏。那一瞬间的感觉就是:这玩意儿早该学了。
它能做的事远不止重复点击。结合无障碍服务和 JavaScript 的逻辑能力,你可以做条件判断、循环重试、OCR 识别、HTTP 请求,甚至把它当成一个小型的手机端爬虫来用。只要是你在手机上能手动完成的操作,理论上都可以用脚本替代。
1.2 技术原理:为什么它能"看见"屏幕并自动操作
Auto.js 的核心依赖是安卓系统的无障碍服务(AccessibilityService)。这个服务本来是给残障人士用的辅助工具,它允许系统在界面发生变化时,主动向服务端发送事件通知。Auto.js 就是利用这个能力,监听当前屏幕上出现了什么控件、什么文字、什么按钮,然后再通过服务模拟手势操作,本质上就是模拟人在屏幕上的触摸动作。
这个"模拟"是系统层面的,不需要 root,也不需要 PC 端配合,所以门槛很低。你用普通的手指点击是触摸事件,Auto.js 调用无障碍接口注入的点击也是同级别的事件,绝大多数 App 是区分不出来的。
这里有一个很重要的点需要理解:无障碍服务拿到的控件信息,类似浏览器里的 DOM 树。每个可交互的按钮、文本框都是一棵控件树里的节点,有类名、有文本内容、有坐标。所以你可以用text("立即领取").click()这种语义化方式去点击,不用关心按钮到底在屏幕哪个位置,系统会帮你找到它。这种方式比固定坐标点击稳定得多。
1.3 为什么不用"录屏点击器"或"物理外设"这类替代品
市面上有很多号称"自动点击器"的 App,通过悬浮窗模拟点击,也能做到循环点某个位置。但它们的缺陷很明显:没有逻辑能力,没有条件判断,没有界面感知,一旦界面布局变化,坐标就全废了。
Auto.js 不一样,它是完整的编程环境。你可以写if判断、while循环、switch分支,可以把流程拆成函数,可以捕获异常,可以处理弹窗。这就像用遥控器控制电视和用编程控制机器人的区别——前者只能按固定按钮,后者可以根据实际情况自主决策。
另一个替代方案是使用 ADB 命令配合 PC 执行,稳定性和权限层级更高,但必须随时连着电脑,没法做到手机独立运行。Auto.js 的优势在于全部在手机上完成,写完了直接跑,打包成 APK 甚至能脱离 Auto.js 环境独立安装运行,分发起来也很方便。
2. 安装前的准备:设备与工具选型
2.1 环境要求和版本选择
Auto.js 的安装门槛不高,但有几个硬性条件需要先确认,否则装完也跑不起来。
首先,手机系统必须是 Android 7.0 及以上。这个要求主要是因为无障碍服务的稳定性和 WebView 调试接口的可用性。现在还在用 Android 7 以下机型的用户应该很少了,绝大多数设备没问题。
其次,不同版本的 Auto.js 功能差异很大,我的建议是优先选择 4.1.1 Alpha2 版本或者基于它二次开发的分支版本。原因有几个:4.x 版本免费、开源、稳定,社区资源丰富,网上能找到大量现成的脚本和插件;而更新的 Pro 版本加入了加密和打包增强功能,但很多能力需要付费解锁,对新手来说不是必须的。
我遇到过一些朋友直接用最新版,结果发现很多老脚本的 API 写法不兼容,还得自己改代码,白白浪费时间。Auto.js 4.x 的 API 文档最齐全,遇到问题搜一下基本都有答案,入门阶段不建议在版本选择上太纠结。
| 版本 | 开源 | 免费 | 稳定性 | 适合人群 |
|---|---|---|---|---|
| Auto.js 4.1.1 Alpha2 | 是 | 是 | 高 | 新手入门、日常自动化 |
| Auto.js Pro 系列 | 否 | 部分付费 | 高 | 有加密与分发需求的进阶用户 |
| 社区分支(如 AutoX.js) | 是 | 是 | 较高 | 需要持续维护与更新的用户 |
社区分支 AutoX.js 是后来接棒维护的项目,修复了老版本在一些新机型上的兼容问题,API 基本保持一致。如果你在 4.1.1 上遇到闪退或无障碍服务不稳定的情况,可以换 AutoX.js 试试。
2.2 下载渠道与安装注意事项
下载 Auto.js 时有一个坑必须提醒:搜索引擎排在前面的很多所谓"官方版"网站其实是第三方打包站,里面塞了广告 SDK,安装之后弹窗多到怀疑人生。
稳妥的做法是去 GitHub 上搜 Auto.js 的 release 页面,下载官方发布的 APK 文件。如果 GitHub 访问技能不熟练,也可以在酷安等安卓应用社区搜索"Auto.js",找到评论区反馈正常的历史版本。我个人习惯是认准包名,正版 Auto.js 的包名一般是org.autojs.autojs,装完之后在系统设置里确认一下,避免装到李鬼应用。
下载完成后,用文件管理器打开 APK 文件直接安装。如果系统提示"禁止安装未知来源应用",需要手动放行——这一步在每个品牌手机上路径不一样,MIUI 是"安全中心 → 应用管理 → 权限 → 未知来源",鸿蒙系统在"设置 → 应用和服务 → 权限管理"里操作,找到你正在用的文件管理器或浏览器,允许"安装未知应用"就行。
注意:从 Android 8.0 开始,不同应用安装 APK 的权限是单独控制的,你让文件管理器能装应用,不代表浏览器也能装。在哪个应用里点击的 APK,就让哪个应用拥有"允许安装未知应用"的权限。
2.3 需要提前理解的三大权限
Auto.js 要正常工作,至少涉及三个系统权限,安装之前先有个概念,后面配置的时候就不蒙了。
第一个是无障碍服务权限,这是核心中的核心。没有它,Auto.js 拿不到屏幕上的控件信息,也没法注入点击和滑动事件。这个权限需要在系统设置里找到"无障碍"或"辅助功能",然后找到 Auto.js 对应的条目,手动打开开关。
第二个是悬浮窗权限,用于显示脚本运行的悬浮按钮、日志窗口、调试面板。如果你希望脚本在自动运行的同时能看到实时输出信息,这个权限必须给。
第三个是应用后台运行权限,包括自启动、后台弹出界面、省电策略不限制等。原因是脚本执行可能持续较长时间,如果手机系统把 Auto.js 的后台进程杀了,脚本就中断了。这部分权限在国产 ROM 上尤其重要,小米、vivo、OPPO 的杀后台策略都激进得很,不设置好,你会发现脚本跑着跑着自己就停了。
3. 完整安装与权限配置实操
3.1 主程序安装流程
下载好 APK 之后,安装动作本身没什么技术含量,但有几个细节值做得比较讲究。
第一步,把手机切换到飞行模式或者断开 Wi-Fi 再安装。这一步是我个人的习惯,因为有些安装包在安装过程中会联网请求权限,断网安装可以避免一些流氓行为。当然,如果你信任下载源,这一步可以省略。
第二步,点击 APK 文件,在弹出的安装界面选择"允许本次安装"。如果你的系统提示"未知来源"拦截,就按照前面说的方法去给对应的应用开权限。
第三步,安装完成之后先别急着打开,先去系统设置里把权限一股脑配置好,再打开主界面。顺序反了也没关系,但你会发现 Auto.js 自己也会弹出权限引导,跟着它的引导走也行。
实操提示:安装完成后,建议进入"设置 → 应用 → Auto.js",把"自启动"权限打开。这一步对小米 EMUI、MIUI、ColorOS 等国产系统的用户尤为重要,否则息屏一段时间后进程容易被系统回收。
3.2 无障碍服务授权:每个人都会卡住的一步
打开 Auto.js 主界面后,点击左侧的"无障碍服务"入口,系统会跳到无障碍设置页。找到"已下载的服务"分类下的 Auto.js 条目,点击进入后打开服务开关。
这一步有个常见的坑:你明明点开了开关,但退回 Auto.js 主界面依然显示"无障碍服务未启用"。出现这种情况,大概率是因为选择了"关闭"旁边的空白区域而不是开关本身,或者系统把这个开关当作"安全敏感操作"延迟生效了。解决办法是开启后等 1-2 秒,再点一次开关确认状态,然后退出设置页面,回到 Auto.js 重新点击服务状态检查。
如果开关确实打不开,或者打开后秒关,这通常是无障碍服务被系统限制,常见于部分 Android 11+ 设备。可以先重启手机再试,还不行就切到 AutoX.js 版本,一般能解决。
3.3 悬浮窗与其他配置项
悬浮窗权限需要在系统设置里搜索"悬浮窗"或"显示在其他应用上层",找到 Auto.js 后打开。
在 MIUI 上,悬浮窗权限和"后台弹出界面"是两个独立设置,前者负责显示,后者决定能否在前台弹出确认弹窗,最好同时打开。ColorOS 的路径是三级菜单:"设置 → 应用管理 → Auto.js → 显示悬浮窗"。
进入 Auto.js 主界面后还有一些设置项建议一并进行:打开"日志"显示开关,方便脚本运行调试;打开"音量键停止"功能,这样脚本卡死时可以快速按音量键终止运行,省得每次都以退出的方式干;关闭"启动时检查更新"选项,避免时不时弹更新提示打断脚本执行。
3.4 连接电脑与脚本管理(附选做项)
如果你打算写比较复杂的脚本,强烈建议在 PC 上编辑,然后在手机上运行。Auto.js 支持两种连接方式。
第一种是局域网连接,手机和电脑在同一 Wi-Fi 下,Auto.js 的"连接电脑"功能会显示一个地址,PC 浏览器访问这个地址就能进行文件的编辑、运行、查看日志。这种方式适合快速验证。
第二种是通过数据线连接,需要用 Android Studio 等工具配合 ADB 转发端口:adb forward tcp:5368 tcp:5368,然后浏览器访问http://localhost:5368,效果和局域网模式一样,但依赖更少的网络条件,PC 与手机直连时优先使用这种方式。
注意:连接电脑功能只在调试时使用,日常运行脚本完全不需要连电脑。脚本文件持久化在手机本地,即使卸载 Auto.js,只要备份
js文件就不怕丢。
4. 测试运行:从零写一个能跑的脚本
4.1 环境自检与第一次执行
打开 Auto.js 主界面,确认左上角状态显示"无障碍服务已开启",悬浮窗按钮已出现。然后在主界面的"脚本"目录下新建一个文件,命名随意,后缀必须是.js。
先写一个最简单的脚本测试环境是否正常:
toast("Hello Auto.js");点击编辑器右上角的运行按钮,或者使用音量快捷键触发运行,屏幕上应该会短暂弹出一条"Hello Auto.js"的系统消息。
如果没有任何反应,先检查右下角悬浮窗是否显示红色日志文字,再回无障碍设置页确认服务状态。这两步能帮你快速定位是权限问题还是脚本代码问题。
4.2 第一个实用脚本:自动打开应用并执行点击
toast 只是开胃菜,接下来写一个真正干活的脚本。场景是:打开微信,等待进入首页,然后自动点击右上角的"+"按钮。
// 唤醒屏幕并解锁(如果没有设置锁屏密码的话) device.wakeUpIfNeeded(); // 打开微信 app.launch("com.tencent.mm"); // 等待微信主界面出现,最长等待10秒 waitForPackage("com.tencent.mm", 10000); // 再等2秒,确保界面完全渲染完成 sleep(2000); // 根据文本找到"+"按钮并点击 var plusButton = text("+").findOnce(); if (plusButton) { plusButton.click(); } else { toast("没有找到+号按钮"); }这段代码涉及几个关键 API,值得展开讲讲。
device.wakeUpIfNeeded()是设备唤醒方法,如果屏幕已经亮着就什么都不做,如果息屏就会点亮屏幕。app.launch()负责启动指定包名的应用,这里com.tencent.mm是微信的包名。
waitForPackage(packageName, timeout)是一个阻塞方法,它会一直等待,直到前台应用切换为目标应用,或者超过超时时间后返回 false。这个等待逻辑很有用,可以避免在应用还没有加载完时就盲目点击。
text("+").findOnce()是控件查找方法,通过界面上的文本内容来定位节点。找到之后调用click()方法模拟点击。
这里要重点说明控件查找的原理:Auto.js 的无障碍服务会把当前屏幕所有控件整理成一棵类似浏览器 DOM 的树,每个节点都有文本、类名、资源 ID、坐标等属性。text("+")就是在这棵树上查找所有文本内容包含"+"的节点。因为微信主界面的"+"号只有一个,所以findOnce()能准确拿到目标节点。
首次运行这个脚本时,建议不要锁屏,保证手机亮屏状态,否则某些设备可能无法正确弹出界面,导致waitForPackage一直超时。
4.3 第二个进阶脚本:自动填写表单并提交
再写一个更贴近真实场景的脚本:在任意 App 的搜索框中输入关键词并点击搜索按钮。
// 点击一个通过资源ID定位的输入框 var input = id("search_input").findOnce(); if (input) { input.click(); sleep(500); } // 输入文字 setText("自动化测试"); // 隐藏键盘 hideKeyboard(); // 点击搜索按钮 var searchBtn = text("搜索").findOnce(); if (searchBtn) { searchBtn.click(); }id("search_input")是根据控件的 resource-id 属性查找,这是安卓布局中最稳定的定位方式之一,比坐标靠谱得多。前提是你知道目标 App 页面上输入框的资源 ID,这个可以通过 Auto.js 自带的布局分析工具"布局范围"获得。
setText("...")是直接给当前聚焦的输入框设置文字。注意它不是模拟逐字输入,而是直接把内容赋给输入框,速度更快,且不受输入法影响。
这里有一个细节:有些 App 会监听输入框的TextWatcher来实时搜索,setText直接赋值也可能触发监听,但不一定触发"删除字→逐字输入"的动画过程。如果你的脚本需要等待搜索结果实时刷新,建议用input("...")方法逐字模拟输入:
input("自动化测试");hideKeyboard()保存键盘隐藏方法,在有些 App 里不隐藏键盘直接点搜索按钮会触发"输入法遮挡"问题。但如果 App 本身适配了 adjustResize 模式,这个问题自然就不存在了,隐藏键盘的操作不是必须的。
4.4 运行方式的三种选择
脚本写好之后,有三种运行方式,适用场景完全不同。
第一种是编辑器中直接运行。适合开发调试,因为可以看到日志输出和错误堆栈,方便定位问题。
第二种是配置定时任务。在 Auto.js 的"定时"页面,可以创建"定时启动脚本"任务,按天、按周、按小时都可以。比如每天早上的 08:30 自动执行一个脚本打卡,就是直接在这里设置。
第三种是打包成独立 APK。在 Auto.js 的"构建"功能里,把脚本打包成一个单独的安装包,安装到手机后不需要开启 Auto.js 就能运行。适合把自动化能力分享给别人使用,不需要对方了解任何脚本知识。
实操心得:日常开发我永远用第一种,任务上线后用第二种,只有需要给别人分发时才用第三种。定时任务启动时如果设备锁屏,需要在脚本开头加上
device.wakeUpIfNeeded()和解锁逻辑,否则黑屏状态下脚本无法正常工作。
5. 常见问题与排查技巧实录
5.1 无障碍服务"一开就关"或"自动失效"
这是我被问得最多的问题,基本上每周都有朋友遇到。原因不外乎三个。
第一个是系统杀后台进程,导致无障碍服务被系统回收。解决方法是:把 Auto.js 加入系统"电池优化白名单",在应用设置里打开"后台运行"和"自启动",部分小米设备还需要在"最近任务"窗口把 Auto.js 下拉锁定。
第二个是系统版本更新后,无障碍服务状态被重置。这种情况下重新打开服务开关即可,没有一劳永逸的办法,只能等系统更新修复。
第三个是 Auto.js 版本与系统不兼容。如果以上两步都没用,实测更换为 AutoX.js 版本通常可以解决,因为社区版对 Android 12/13 的适配做得多得多。
5.2 脚本运行时日志报"找不到控件"
很多新手写脚本时遇到text("xx").findOnce()返回 null,第一反应是代码写错了,但实际上大概率是控件还没出现在屏幕上。页面加载是异步的,控件渲染需要时间,所以查找控件前需要加等待。
推荐的方式是使用waitFor()方法,它会主动轮询,直到找到才返回:
var btn = text("确定").waitFor(5000); if (btn) { btn.click(); }如果等待到了还是不出现,那就要怀疑是不是选错了定位方式。有的按钮是 android 自带的 Button 控件,有的则是自定义 View,某些自定义 View 的文本可能不会被无障碍服务识别。这种情况可以改用desc("描述").findOnce()查找内容描述,或者使用bounds()获取控件坐标进行点击。
5.3 打包 APK 时的常见报错
打包 APK 是很多人的"最后一步",但往往在这里卡住。我整理几个典型的打包失败原因。
打包失败的报错信息里如果出现"Could not find the android platform"之类的内容,是因为缺少对应的 Android SDK 平台版本。解决办法是下载并安装 Auto.js 提示缺失的平台版本,安装路径一般是 SDK 目录下的platforms文件夹。
如果报错信息出现"Gradle"相关的错误,大概率是 Gradle 依赖下载失败。这在国内网络环境下特别常见,解决方式是配置 Gralde 镜像仓库,或者在网络通畅的时段重试。
打包成功后如果安装到别的设备提示"解析包错误",检查一下打包时的 SDK 版本,不要选太高的 targetSdk,兼容性会更好。
5.4 脚本运行无响应,手机像死机了一样
这种情况通常是脚本进入了死循环,比如while (true) { ... }且没有退出条件。解决方式就是最开始提过的"音量键停止":在设置中打开这个功能,脚本失控时同时按住音量上下键 2 秒,Auto.js 会强制终止当前运行的脚本。
如果音量键也没反应,可以尝试从最近任务界面划掉 Auto.js,或者直接重启手机。事后检查脚本逻辑,在循环中加上延时sleep(1000),并设置合理的退出条件,避免无意义的空转。
独家避坑技巧:开发阶段,所有可能长期循环的逻辑都先加一个"测试模式"退出路径。比如在文件开头定义一个全局变量,判定
debug = true时循环只跑几次就结束。上线前再把标记改为 false。这个方法帮我节省了大量调试时间,推荐照做。
5.5 不同品牌 ROM 的兼容性问题速查
| 品牌 | 常见问题 | 推荐设置 |
|---|---|---|
| 小米/Redmi | 无障碍服务易失效;后台被杀 | 电池策略"无限制";自启动开启;锁屏后弹出权限全开启 |
| 华为/荣耀 | 悬浮窗权限需要单独开启;HarmonyOS 下无障碍能力受限 | 设置→应用和服务→权限管理→悬浮窗;关闭省电优化 |
| OPPO/realme | 频繁弹出"自动开启无障碍"请求 | 应用管理→允许"修改系统设置";关闭"自动启动管理"的监控 |
| vivo/iQOO | 后台运行被杀严重 | 设置→电池→后台耗电管理→允许高耗电 |
| 三星 | 权限路径较深 | 设置→智能管理器→应用程序管理→允许后台运行 |
这套兼容性不是代码层面要处理的,而是权限和系统设置的匹配问题。跨品牌做分发时,在脚本启动时做一次权限检查是最稳妥的做法,如果权限缺失就弹窗提示用户手动去设置。
写在最后:我的实际使用建议
Auto.js 确实是一个学习曲线不陡峭但天花板很高的工具。我建议你先从小事开始:比如一个每天自动签到、自动领积分的小脚本,跑顺了再到稍微复杂一点的场景。不要一上来就想写全自动的操作系统,失败率太高,容易打击信心。
我最受益的一个习惯是把常用的小功能拆成独立的脚本文件,比如"唤醒解锁.js"、"打开微信.js"、"点击控件.js",然后用主脚本统一调用。这样单个脚本的职责清晰,任何一个环节出错都能快速替换,不会被整段逻辑拖住。
遇到问题时,多利用 Auto.js 自带的布局分析功能,这一步是调试的基本功。很多看起来神秘的"找不到控件"、"点击无效"问题,打开布局分析一看就明白了——要么控件是用图片实现的没有文本属性,要么是系统弹窗覆盖了目标界面。看懂了控件树,你就能写出稳定的定位逻辑。
Auto.js 这个工具陪伴了我很长时间,直到现在我仍然觉得它是安卓自动化领域最值得投入时间去学的开源项目之一。希望这篇内容能帮你把第一行脚本跑起来,少走几个弯路。